/*
    generated by jscc, an LALR(1) parser generator made by hadroncfy.
    template for typescript, written by hadroncfy, aussi.
*/

import { GBuilder, createFileBuilder, TokenRefType } from './gbuilder';
import { Assoc } from '../grammar/token-entry';
import { CompilationError as E, JsccError } from '../util/E';
import { Context } from '../util/context';
import { LexAction } from '../lexer/action';
import { Position, JNode, newNode, markPosition, nodeBetween, nodeExtend } from './node';
import { File } from './file';

function nodeFromToken(t: Token): JNode{
    return {
        val: t.val,
        ext: null,
        startLine: t.startLine,
        startColumn: t.startColumn,
        endLine: t.endLine,
        endColumn: t.endColumn
    };
}
function nodeFromTrivalToken(t: Token): JNode{
    return {
        val: null,
        ext: null,
        startLine: t.startLine,
        startColumn: t.startColumn,
        endLine: t.endLine,
        endColumn: t.endColumn
    };
}
let escapes: {[s: string]: string} = {
    'n': '\n',
    'f': '\f',
    'b': '\b',
    'r': '\r',
    't': '\t',
    '\\': '\\',
    '"': '"',
    "'": "'"
};
function unescape(s: string): string{
    let ret = '';
    let i = 0;
    while(i < s.length){
        let c = s.charAt(i);
        if(c === '\\'){
            c = s.charAt(++i);
            if(escapes[c]){
                ret += escapes[c];
                i++;
            }
            else if(c === 'u' || c === 'x' || c === 'U' || c === 'X'){
                c = s.charAt(++i);
                let hex = '';
                while(/[0-9a-fA-F]/.test(c)){
                    hex += c;
                    c = s.charAt(++i);
                }
                ret += String.fromCharCode(parseInt(hex, 16));
            }
        }
        else {
            ret += c;
            i++;
        }
    }
    return ret;
}

/*
    constants
*/
var jjlf = '\n'.charCodeAt(0);
var jjcr = '\r'.charCodeAt(0);
interface DFATable{
    pnext: number[];
    disnext: number[];
    checknext: number[];
    maxAsicii: number;
    classTable: number[];
    unicodeClassTable: number[];
    isEnd: number[];
    hasArc: number[];
};
/*
    dfa table definations
*/
var jjlexpnext0: number[] = [ 
        50,    50,   141,    50,    50,    50,    50,    50,    51,    50,
        50,    50,    50,    50,    50,    50,   112,    50,    50,    50,
        50,    50,    50,   112,    50,    50,    52,    50,    50,    50,
       112,   112,   112,   112,   112,   112,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    30,    30,   140,
        30,    31,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    95,    30,    30,    30,    30,    30,    30,
        95,    30,    30,    32,    30,    30,    30,    95,    95,    95,
        95,    95,    95,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    50,    50,   139,    50,    50,    50,
        50,    50,    51,    50,    50,    50,    50,    50,    50,    50,
       112,    50,    50,    50,    50,    50,    50,   112,    50,    50,
        52,    50,    50,    50,   112,   112,   112,   112,   112,   112,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    30,    30,   138,    30,    31,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    95,    30,    30,
        30,    30,    30,    30,    95,    30,    30,    32,    30,    30,
        30,    95,    95,    95,    95,    95,    95,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    50,    50,
       137,    50,    50,    50,    50,    50,    51,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    52,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    30,    30,   136,    30,    31,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    32,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    33,    33,   135,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    50,
        50,   134,    50,    50,    50,    50,    50,    51,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    52,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    33,    33,   133,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    30,    30,   132,    30,    31,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    32,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        50,    50,   131,    50,    50,    50,    50,    50,    51,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    52,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    33,    33,   130,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    30,    30,   129,    30,    31,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        32,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,     1,     2,     3,     4,     5,     6,     7,     8,     9,
        10,    11,    12,    13,    14,    15,   128,    16,    17,    18,
        19,    20,    21,     6,     6,    22,   127,    23,    24,     6,
         6,     6,     6,     6,     6,     6,     6,     6,     6,     6,
         6,     6,     6,     6,     6,     6,     6,     6,     6,     6,
         6,     6,    25,    26,    27,    28,    34,    82,    90,    66,
        70,    59,    83,    67,    62,    63,    35,    91,    71,   126,
        60,    53,   125,    34,    34,    54,   124,    84,   123,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,   122,   121,    36,    37,   120,   119,   118,
       117,   116,    35,   115,   114,   113,   111,   110,   109,    34,
        34,   108,   107,   106,   105,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,   104,
       103,    36,    37,   102,   101,   100,    99,    98,    35,    97,
        96,    93,    92,    89,    88,    34,    34,    87,    86,    85,
        81,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    80,    79,    36,    37,    78,
        77,    76,    72,    69,    35,    68,    65,    64,    61,    58,
        55,    34,    34,    29,     1,    -1,    -1,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    -1,    -1,    36,    37,    -1,    -1,    -1,    -1,    -1,
        35,    -1,    -1,    -1,    -1,    -1,    -1,    34,    34,    -1,
        -1,    -1,    -1,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    -1,    -1,    36,
        37,    -1,    -1,    -1,    -1,    -1,    35,    -1,    -1,    -1,
        -1,    -1,    -1,    34,    34,    -1,    -1,    -1,    -1,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    38,    -1,    -1,    36,    37,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    73,    -1,    -1,    -1,    73,    -1,
        -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    40,
        -1,    -1,    41,    42,    74,    43,    73,    44,    45,    46,
        47,    73,    48,    49,    56,    73,    -1,    -1,    56,    -1,
        -1,    -1,    73,    -1,    -1,    73,    -1,    73,    74,    -1,
        74,    -1,    94,    -1,    57,    -1,    56,    -1,    -1,    94,
        -1,    56,    -1,    -1,    -1,    56,    94,    94,    94,    94,
        94,    94,    56,    -1,    75,    56,    -1,    56,    57,    -1,
        57,    75,    -1,    -1,    -1,    -1,    -1,    -1,    75,    75,
        75,    75,    75,    75,
]; 
var jjlexdisnext0: number[] = [ 
       740,   953,   -57,   951,   684,   627,  1020,  1065,   570,   -57,
       -57,   -57,   -57,   -57,   -57,   800,   -57,   -57,   -57,   929,
       -57,   -57,   -57,   -57,   -57,   -57,   -57,   -57,   974,   -57,
       513,   -57,  1110,   456,   928,   882,   836,   790,   -57,   909,
       760,   914,   763,   913,   903,   755,   900,   905,   757,   896,
       399,   -57,  1080,   -57,   342,   -57,   285,  1138,   892,   896,
       892,   906,   891,   872,   767,   867,   861,   860,   870,   867,
       759,   858,   867,   228,  1116,   171,   870,   852,   852,   863,
       852,   847,   847,   843,   -57,   859,   826,   819,   830,   824,
       824,   825,   822,   -57,   114,    57,   804,   803,   823,   817,
       805,   -57,   802,   -57,   802,   804,   796,   -57,   796,   776,
       779,   -57,     0,   766,   -57,   780,   721,   709,   -57,   640,
       587,   525,   -57,   486,   -57,   -57,   428,   -57,   -57,   358,
       -57,   -57,   307,   242,   198,   130,    80,   -57,    16,   -57,
       -37,   -57,
]; 
var jjlexchecknext0: number[] = [ 
       112,   112,   140,   112,   112,   112,   112,   112,   112,   112,
       112,   112,   112,   112,   112,   112,   112,   112,   112,   112,
       112,   112,   112,   112,   112,   112,   112,   112,   112,   112,
       112,   112,   112,   112,   112,   112,   112,   112,   112,   112,
       112,   112,   112,   112,   112,   112,   112,   112,   112,   112,
       112,   112,   112,   112,   112,   112,   112,    95,    95,   138,
        95,    95,    95,    95,    95,    95,    95,    95,    95,    95,
        95,    95,    95,    95,    95,    95,    95,    95,    95,    95,
        95,    95,    95,    95,    95,    95,    95,    95,    95,    95,
        95,    95,    95,    95,    95,    95,    95,    95,    95,    95,
        95,    95,    95,    95,    95,    95,    95,    95,    95,    95,
        95,    95,    95,    95,    94,    94,   136,    94,    94,    94,
        94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
        94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
        94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
        94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
        94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
        94,    75,    75,   135,    75,    75,    75,    75,    75,    75,
        75,    75,    75,    75,    75,    75,    75,    75,    75,    75,
        75,    75,    75,    75,    75,    75,    75,    75,    75,    75,
        75,    75,    75,    75,    75,    75,    75,    75,    75,    75,
        75,    75,    75,    75,    75,    75,    75,    75,    75,    75,
        75,    75,    75,    75,    75,    75,    75,    75,    73,    73,
       134,    73,    73,    73,    73,    73,    73,    73,    73,    73,
        73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
        73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
        73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
        73,    73,    73,    73,    73,    73,    73,    73,    73,    73,
        73,    73,    73,    73,    73,    56,    56,   133,    56,    56,
        56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
        56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
        56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
        56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
        56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
        56,    56,    54,    54,   132,    54,    54,    54,    54,    54,
        54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
        54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
        54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
        54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
        54,    54,    54,    54,    54,    54,    54,    54,    54,    50,
        50,   129,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
        50,    50,    50,    50,    50,    50,    33,    33,   126,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    30,    30,   123,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
        30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
         8,     8,   121,     8,     8,     8,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     5,     5,   120,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     4,     4,   119,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
         4,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,   117,     0,     0,     0,
         0,     0,     0,     0,     0,     0,   116,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,    37,    64,    70,    45,
        48,    40,    64,    45,    42,    42,    37,    70,    48,   115,
        40,    15,   113,    37,    37,    15,   110,    64,   109,    37,
        37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
        37,    37,    37,    37,    37,    37,    37,    37,    37,    37,
        37,    37,    36,   108,   106,    37,    37,   105,   104,   102,
       100,    99,    36,    98,    97,    96,    92,    91,    90,    36,
        36,    89,    88,    87,    86,    36,    36,    36,    36,    36,
        36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
        36,    36,    36,    36,    36,    36,    36,    36,    35,    85,
        83,    36,    36,    82,    81,    80,    79,    78,    35,    77,
        76,    72,    71,    69,    68,    35,    35,    67,    66,    65,
        63,    35,    35,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    35,    34,    62,    61,    35,    35,    60,
        59,    58,    49,    47,    34,    46,    44,    43,    41,    39,
        19,    34,    34,     3,     1,    -1,    -1,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        28,    -1,    -1,    34,    34,    -1,    -1,    -1,    -1,    -1,
        28,    -1,    -1,    -1,    -1,    -1,    -1,    28,    28,    -1,
        -1,    -1,    -1,    28,    28,    28,    28,    28,    28,    28,
        28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
        28,    28,    28,    28,    28,    28,     6,    -1,    -1,    28,
        28,    -1,    -1,    -1,    -1,    -1,     6,    -1,    -1,    -1,
        -1,    -1,    -1,     6,     6,    -1,    -1,    -1,    -1,     6,
         6,     6,     6,     6,     6,     6,     6,     6,     6,     6,
         6,     6,     6,     6,     6,     6,     6,     6,     6,     6,
         6,     6,     7,    -1,    -1,     6,     6,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    52,    -1,
        -1,    -1,    -1,    -1,    -1,     7,    -1,    -1,    -1,     7,
        -1,    -1,     7,     7,    52,     7,    52,     7,     7,     7,
         7,    52,     7,     7,    32,    52,    -1,    -1,    32,    -1,
        -1,    -1,    52,    -1,    -1,    52,    -1,    52,    52,    -1,
        52,    -1,    74,    -1,    32,    -1,    32,    -1,    -1,    74,
        -1,    32,    -1,    -1,    -1,    32,    74,    74,    74,    74,
        74,    74,    32,    -1,    57,    32,    -1,    32,    32,    -1,
        32,    57,    -1,    -1,    -1,    -1,    -1,    -1,    57,    57,
        57,    57,    57,    57,
]; 
var jjlexclassTable0: number[] = [ 
         0,     0,     0,     0,     0,     0,     0,     0,     0,     1,
         2,     0,     0,     3,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     1,     0,     4,     5,     6,     7,     0,     8,
         9,    10,    11,    12,    13,    14,     0,    15,    16,    16,
        16,    16,    16,    16,    16,    16,    16,    16,    17,    18,
        19,    20,    21,    22,     0,    23,    23,    23,    23,    23,
        23,     6,     6,     6,     6,     6,     6,     6,     6,     6,
         6,     6,     6,     6,     6,    24,     6,     6,    24,     6,
         6,    25,    26,    27,    28,    29,     0,    30,    31,    32,
        33,    34,    35,    36,    37,    38,     6,    39,    40,    41,
        42,    43,    44,     6,    45,    46,    47,    48,     6,    49,
        50,    51,     6,    52,    53,    54,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        55,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,    55,     0,     0,     0,     0,    55,     0,     0,     0,
         0,     0,    55,    55,    55,    55,    55,    55,    55,    55,
        55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
        55,    55,    55,    55,    55,     0,    55,    55,    55,    55,
        55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
        55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
        55,    55,    55,    55,    55,    55,    55,     0,    55,    55,
        55,    55,    55,    55,    55,    55,
]; 
var jjlexunicodeClassTable0: number[] = [ 
        55,   256,   705,     0,   706,   709,    55,   710,   721,     0,
       722,   735,    55,   736,   740,     0,   741,   747,    55,   748,
       748,     0,   749,   749,    55,   750,   750,     0,   751,   767,
        56,   768,   879,    55,   880,   884,     0,   885,   885,    55,
       886,   887,     0,   888,   889,    55,   890,   893,     0,   894,
       901,    55,   902,   902,     0,   903,   903,    55,   904,   906,
         0,   907,   907,    55,   908,   908,     0,   909,   909,    55,
       910,   929,     0,   930,   930,    55,   931,  1013,     0,  1014,
      1014,    55,  1015,  1153,     0,  1154,  1154,    56,  1155,  1159,
         0,  1160,  1161,    55,  1162,  1319,     0,  1320,  1328,    55,
      1329,  1366,     0,  1367,  1368,    55,  1369,  1369,     0,  1370,
      1376,    55,  1377,  1415,     0,  1416,  1424,    56,  1425,  1469,
         0,  1470,  1470,    56,  1471,  1471,     0,  1472,  1472,    56,
      1473,  1474,     0,  1475,  1475,    56,  1476,  1477,     0,  1478,
      1478,    56,  1479,  1479,     0,  1480,  1487,    55,  1488,  1514,
         0,  1515,  1519,    55,  1520,  1522,     0,  1523,  1551,    56,
      1552,  1562,     0,  1563,  1567,    55,  1568,  1610,    56,  1611,
      1641,     0,  1642,  1645,    55,  1646,  1647,    56,  1648,  1648,
        55,  1649,  1747,     0,  1748,  1748,    55,  1749,  1749,    56,
      1750,  1756,     0,  1757,  1758,    56,  1759,  1764,    55,  1765,
      1766,    56,  1767,  1768,     0,  1769,  1769,    56,  1770,  1773,
        55,  1774,  1775,    56,  1776,  1785,    55,  1786,  1788,     0,
      1789,  1790,    55,  1791,  1791,     0,  1792,  1807,    55,  1808,
      1808,    56,  1809,  1809,    55,  1810,  1839,    56,  1840,  1866,
         0,  1867,  1868,    55,  1869,  1957,    56,  1958,  1968,    55,
      1969,  1969,     0,  1970,  1983,    56,  1984,  1993,    55,  1994,
      2026,    56,  2027,  2035,    55,  2036,  2037,     0,  2038,  2041,
        55,  2042,  2042,     0,  2043,  2047,    55,  2048,  2069,    56,
      2070,  2073,    55,  2074,  2074,    56,  2075,  2083,    55,  2084,
      2084,    56,  2085,  2087,    55,  2088,  2088,    56,  2089,  2093,
         0,  2094,  2111,    55,  2112,  2136,    56,  2137,  2139,     0,
      2140,  2207,    55,  2208,  2208,     0,  2209,  2209,    55,  2210,
      2220,     0,  2221,  2275,    56,  2276,  2302,     0,  2303,  2303,
        56,  2304,  2307,    55,  2308,  2361,    56,  2362,  2364,    55,
      2365,  2365,    56,  2366,  2383,    55,  2384,  2384,    56,  2385,
      2391,    55,  2392,  2401,    56,  2402,  2403,     0,  2404,  2405,
        56,  2406,  2415,     0,  2416,  2416,    55,  2417,  2423,     0,
      2424,  2424,    55,  2425,  2431,     0,  2432,  2432,    56,  2433,
      2435,     0,  2436,  2436,    55,  2437,  2444,     0,  2445,  2446,
        55,  2447,  2448,     0,  2449,  2450,    55,  2451,  2472,     0,
      2473,  2473,    55,  2474,  2480,     0,  2481,  2481,    55,  2482,
      2482,     0,  2483,  2485,    55,  2486,  2489,     0,  2490,  2491,
        56,  2492,  2492,    55,  2493,  2493,    56,  2494,  2500,     0,
      2501,  2502,    56,  2503,  2504,     0,  2505,  2506,    56,  2507,
      2509,    55,  2510,  2510,     0,  2511,  2518,    56,  2519,  2519,
         0,  2520,  2523,    55,  2524,  2525,     0,  2526,  2526,    55,
      2527,  2529,    56,  2530,  2531,     0,  2532,  2533,    56,  2534,
      2543,    55,  2544,  2545,     0,  2546,  2560,    56,  2561,  2563,
         0,  2564,  2564,    55,  2565,  2570,     0,  2571,  2574,    55,
      2575,  2576,     0,  2577,  2578,    55,  2579,  2600,     0,  2601,
      2601,    55,  2602,  2608,     0,  2609,  2609,    55,  2610,  2611,
         0,  2612,  2612,    55,  2613,  2614,     0,  2615,  2615,    55,
      2616,  2617,     0,  2618,  2619,    56,  2620,  2620,     0,  2621,
      2621,    56,  2622,  2626,     0,  2627,  2630,    56,  2631,  2632,
         0,  2633,  2634,    56,  2635,  2637,     0,  2638,  2640,    56,
      2641,  2641,     0,  2642,  2648,    55,  2649,  2652,     0,  2653,
      2653,    55,  2654,  2654,     0,  2655,  2661,    56,  2662,  2673,
        55,  2674,  2676,    56,  2677,  2677,     0,  2678,  2688,    56,
      2689,  2691,     0,  2692,  2692,    55,  2693,  2701,     0,  2702,
      2702,    55,  2703,  2705,     0,  2706,  2706,    55,  2707,  2728,
         0,  2729,  2729,    55,  2730,  2736,     0,  2737,  2737,    55,
      2738,  2739,     0,  2740,  2740,    55,  2741,  2745,     0,  2746,
      2747,    56,  2748,  2748,    55,  2749,  2749,    56,  2750,  2757,
         0,  2758,  2758,    56,  2759,  2761,     0,  2762,  2762,    56,
      2763,  2765,     0,  2766,  2767,    55,  2768,  2768,     0,  2769,
      2783,    55,  2784,  2785,    56,  2786,  2787,     0,  2788,  2789,
        56,  2790,  2799,     0,  2800,  2816,    56,  2817,  2819,     0,
      2820,  2820,    55,  2821,  2828,     0,  2829,  2830,    55,  2831,
      2832,     0,  2833,  2834,    55,  2835,  2856,     0,  2857,  2857,
        55,  2858,  2864,     0,  2865,  2865,    55,  2866,  2867,     0,
      2868,  2868,    55,  2869,  2873,     0,  2874,  2875,    56,  2876,
      2876,    55,  2877,  2877,    56,  2878,  2884,     0,  2885,  2886,
        56,  2887,  2888,     0,  2889,  2890,    56,  2891,  2893,     0,
      2894,  2901,    56,  2902,  2903,     0,  2904,  2907,    55,  2908,
      2909,     0,  2910,  2910,    55,  2911,  2913,    56,  2914,  2915,
         0,  2916,  2917,    56,  2918,  2927,     0,  2928,  2928,    55,
      2929,  2929,     0,  2930,  2945,    56,  2946,  2946,    55,  2947,
      2947,     0,  2948,  2948,    55,  2949,  2954,     0,  2955,  2957,
        55,  2958,  2960,     0,  2961,  2961,    55,  2962,  2965,     0,
      2966,  2968,    55,  2969,  2970,     0,  2971,  2971,    55,  2972,
      2972,     0,  2973,  2973,    55,  2974,  2975,     0,  2976,  2978,
        55,  2979,  2980,     0,  2981,  2983,    55,  2984,  2986,     0,
      2987,  2989,    55,  2990,  3001,     0,  3002,  3005,    56,  3006,
      3010,     0,  3011,  3013,    56,  3014,  3016,     0,  3017,  3017,
        56,  3018,  3021,     0,  3022,  3023,    55,  3024,  3024,     0,
      3025,  3030,    56,  3031,  3031,     0,  3032,  3045,    56,  3046,
      3055,     0,  3056,  3072,    56,  3073,  3075,     0,  3076,  3076,
        55,  3077,  3084,     0,  3085,  3085,    55,  3086,  3088,     0,
      3089,  3089,    55,  3090,  3112,     0,  3113,  3113,    55,  3114,
      3123,     0,  3124,  3124,    55,  3125,  3129,     0,  3130,  3132,
        55,  3133,  3133,    56,  3134,  3140,     0,  3141,  3141,    56,
      3142,  3144,     0,  3145,  3145,    56,  3146,  3149,     0,  3150,
      3156,    56,  3157,  3158,     0,  3159,  3159,    55,  3160,  3161,
         0,  3162,  3167,    55,  3168,  3169,    56,  3170,  3171,     0,
      3172,  3173,    56,  3174,  3183,     0,  3184,  3201,    56,  3202,
      3203,     0,  3204,  3204,    55,  3205,  3212,     0,  3213,  3213,
        55,  3214,  3216,     0,  3217,  3217,    55,  3218,  3240,     0,
      3241,  3241,    55,  3242,  3251,     0,  3252,  3252,    55,  3253,
      3257,     0,  3258,  3259,    56,  3260,  3260,    55,  3261,  3261,
        56,  3262,  3268,     0,  3269,  3269,    56,  3270,  3272,     0,
      3273,  3273,    56,  3274,  3277,     0,  3278,  3284,    56,  3285,
      3286,     0,  3287,  3293,    55,  3294,  3294,     0,  3295,  3295,
        55,  3296,  3297,    56,  3298,  3299,     0,  3300,  3301,    56,
      3302,  3311,     0,  3312,  3312,    55,  3313,  3314,     0,  3315,
      3329,    56,  3330,  3331,     0,  3332,  3332,    55,  3333,  3340,
         0,  3341,  3341,    55,  3342,  3344,     0,  3345,  3345,    55,
      3346,  3386,     0,  3387,  3388,    55,  3389,  3389,    56,  3390,
      3396,     0,  3397,  3397,    56,  3398,  3400,     0,  3401,  3401,
        56,  3402,  3405,    55,  3406,  3406,     0,  3407,  3414,    56,
      3415,  3415,     0,  3416,  3423,    55,  3424,  3425,    56,  3426,
      3427,     0,  3428,  3429,    56,  3430,  3439,     0,  3440,  3449,
        55,  3450,  3455,     0,  3456,  3457,    56,  3458,  3459,     0,
      3460,  3460,    55,  3461,  3478,     0,  3479,  3481,    55,  3482,
      3505,     0,  3506,  3506,    55,  3507,  3515,     0,  3516,  3516,
        55,  3517,  3517,     0,  3518,  3519,    55,  3520,  3526,     0,
      3527,  3529,    56,  3530,  3530,     0,  3531,  3534,    56,  3535,
      3540,     0,  3541,  3541,    56,  3542,  3542,     0,  3543,  3543,
        56,  3544,  3551,     0,  3552,  3569,    56,  3570,  3571,     0,
      3572,  3584,    55,  3585,  3632,    56,  3633,  3633,    55,  3634,
      3635,    56,  3636,  3642,     0,  3643,  3647,    55,  3648,  3654,
        56,  3655,  3662,     0,  3663,  3663,    56,  3664,  3673,     0,
      3674,  3712,    55,  3713,  3714,     0,  3715,  3715,    55,  3716,
      3716,     0,  3717,  3718,    55,  3719,  3720,     0,  3721,  3721,
        55,  3722,  3722,     0,  3723,  3724,    55,  3725,  3725,     0,
      3726,  3731,    55,  3732,  3735,     0,  3736,  3736,    55,  3737,
      3743,     0,  3744,  3744,    55,  3745,  3747,     0,  3748,  3748,
        55,  3749,  3749,     0,  3750,  3750,    55,  3751,  3751,     0,
      3752,  3753,    55,  3754,  3755,     0,  3756,  3756,    55,  3757,
      3760,    56,  3761,  3761,    55,  3762,  3763,    56,  3764,  3769,
         0,  3770,  3770,    56,  3771,  3772,    55,  3773,  3773,     0,
      3774,  3775,    55,  3776,  3780,     0,  3781,  3781,    55,  3782,
      3782,     0,  3783,  3783,    56,  3784,  3789,     0,  3790,  3791,
        56,  3792,  3801,     0,  3802,  3803,    55,  3804,  3807,     0,
      3808,  3839,    55,  3840,  3840,     0,  3841,  3863,    56,  3864,
      3865,     0,  3866,  3871,    56,  3872,  3881,     0,  3882,  3892,
        56,  3893,  3893,     0,  3894,  3894,    56,  3895,  3895,     0,
      3896,  3896,    56,  3897,  3897,     0,  3898,  3901,    56,  3902,
      3903,    55,  3904,  3911,     0,  3912,  3912,    55,  3913,  3948,
         0,  3949,  3952,    56,  3953,  3972,     0,  3973,  3973,    56,
      3974,  3975,    55,  3976,  3980,    56,  3981,  3991,     0,  3992,
      3992,    56,  3993,  4028,     0,  4029,  4037,    56,  4038,  4038,
         0,  4039,  4095,    55,  4096,  4138,    56,  4139,  4158,    55,
      4159,  4159,    56,  4160,  4169,     0,  4170,  4175,    55,  4176,
      4181,    56,  4182,  4185,    55,  4186,  4189,    56,  4190,  4192,
        55,  4193,  4193,    56,  4194,  4196,    55,  4197,  4198,    56,
      4199,  4205,    55,  4206,  4208,    56,  4209,  4212,    55,  4213,
      4225,    56,  4226,  4237,    55,  4238,  4238,    56,  4239,  4253,
         0,  4254,  4255,    55,  4256,  4293,     0,  4294,  4294,    55,
      4295,  4295,     0,  4296,  4300,    55,  4301,  4301,     0,  4302,
      4303,    55,  4304,  4346,     0,  4347,  4347,    55,  4348,  4680,
         0,  4681,  4681,    55,  4682,  4685,     0,  4686,  4687,    55,
      4688,  4694,     0,  4695,  4695,    55,  4696,  4696,     0,  4697,
      4697,    55,  4698,  4701,     0,  4702,  4703,    55,  4704,  4744,
         0,  4745,  4745,    55,  4746,  4749,     0,  4750,  4751,    55,
      4752,  4784,     0,  4785,  4785,    55,  4786,  4789,     0,  4790,
      4791,    55,  4792,  4798,     0,  4799,  4799,    55,  4800,  4800,
         0,  4801,  4801,    55,  4802,  4805,     0,  4806,  4807,    55,
      4808,  4822,     0,  4823,  4823,    55,  4824,  4880,     0,  4881,
      4881,    55,  4882,  4885,     0,  4886,  4887,    55,  4888,  4954,
         0,  4955,  4956,    56,  4957,  4959,     0,  4960,  4991,    55,
      4992,  5007,     0,  5008,  5023,    55,  5024,  5108,     0,  5109,
      5120,    55,  5121,  5740,     0,  5741,  5742,    55,  5743,  5759,
         0,  5760,  5760,    55,  5761,  5786,     0,  5787,  5791,    55,
      5792,  5866,     0,  5867,  5869,    55,  5870,  5872,     0,  5873,
      5887,    55,  5888,  5900,     0,  5901,  5901,    55,  5902,  5905,
        56,  5906,  5908,     0,  5909,  5919,    55,  5920,  5937,    56,
      5938,  5940,     0,  5941,  5951,    55,  5952,  5969,    56,  5970,
      5971,     0,  5972,  5983,    55,  5984,  5996,     0,  5997,  5997,
        55,  5998,  6000,     0,  6001,  6001,    56,  6002,  6003,     0,
      6004,  6015,    55,  6016,  6067,    56,  6068,  6099,     0,  6100,
      6102,    55,  6103,  6103,     0,  6104,  6107,    55,  6108,  6108,
        56,  6109,  6109,     0,  6110,  6111,    56,  6112,  6121,     0,
      6122,  6154,    56,  6155,  6157,     0,  6158,  6159,    56,  6160,
      6169,     0,  6170,  6175,    55,  6176,  6263,     0,  6264,  6271,
        55,  6272,  6312,    56,  6313,  6313,    55,  6314,  6314,     0,
      6315,  6319,    55,  6320,  6389,     0,  6390,  6399,    55,  6400,
      6428,     0,  6429,  6431,    56,  6432,  6443,     0,  6444,  6447,
        56,  6448,  6459,     0,  6460,  6469,    56,  6470,  6479,    55,
      6480,  6509,     0,  6510,  6511,    55,  6512,  6516,     0,  6517,
      6527,    55,  6528,  6571,     0,  6572,  6575,    56,  6576,  6592,
        55,  6593,  6599,    56,  6600,  6601,     0,  6602,  6607,    56,
      6608,  6617,     0,  6618,  6655,    55,  6656,  6678,    56,  6679,
      6683,     0,  6684,  6687,    55,  6688,  6740,    56,  6741,  6750,
         0,  6751,  6751,    56,  6752,  6780,     0,  6781,  6782,    56,
      6783,  6793,     0,  6794,  6799,    56,  6800,  6809,     0,  6810,
      6822,    55,  6823,  6823,     0,  6824,  6911,    56,  6912,  6916,
        55,  6917,  6963,    56,  6964,  6980,    55,  6981,  6987,     0,
      6988,  6991,    56,  6992,  7001,     0,  7002,  7018,    56,  7019,
      7027,     0,  7028,  7039,    56,  7040,  7042,    55,  7043,  7072,
        56,  7073,  7085,    55,  7086,  7087,    56,  7088,  7097,    55,
      7098,  7141,    56,  7142,  7155,     0,  7156,  7167,    55,  7168,
      7203,    56,  7204,  7223,     0,  7224,  7231,    56,  7232,  7241,
         0,  7242,  7244,    55,  7245,  7247,    56,  7248,  7257,    55,
      7258,  7293,     0,  7294,  7375,    56,  7376,  7378,     0,  7379,
      7379,    56,  7380,  7400,    55,  7401,  7404,    56,  7405,  7405,
        55,  7406,  7409,    56,  7410,  7412,    55,  7413,  7414,     0,
      7415,  7423,    55,  7424,  7615,    56,  7616,  7654,     0,  7655,
      7675,    56,  7676,  7679,    55,  7680,  7957,     0,  7958,  7959,
        55,  7960,  7965,     0,  7966,  7967,    55,  7968,  8005,     0,
      8006,  8007,    55,  8008,  8013,     0,  8014,  8015,    55,  8016,
      8023,     0,  8024,  8024,    55,  8025,  8025,     0,  8026,  8026,
        55,  8027,  8027,     0,  8028,  8028,    55,  8029,  8029,     0,
      8030,  8030,    55,  8031,  8061,     0,  8062,  8063,    55,  8064,
      8116,     0,  8117,  8117,    55,  8118,  8124,     0,  8125,  8125,
        55,  8126,  8126,     0,  8127,  8129,    55,  8130,  8132,     0,
      8133,  8133,    55,  8134,  8140,     0,  8141,  8143,    55,  8144,
      8147,     0,  8148,  8149,    55,  8150,  8155,     0,  8156,  8159,
        55,  8160,  8172,     0,  8173,  8177,    55,  8178,  8180,     0,
      8181,  8181,    55,  8182,  8188,     0,  8189,  8203,    56,  8204,
      8205,     0,  8206,  8254,    56,  8255,  8256,     0,  8257,  8275,
        56,  8276,  8276,     0,  8277,  8304,    55,  8305,  8305,     0,
      8306,  8318,    55,  8319,  8319,     0,  8320,  8335,    55,  8336,
      8348,     0,  8349,  8399,    56,  8400,  8412,     0,  8413,  8416,
        56,  8417,  8417,     0,  8418,  8420,    56,  8421,  8432,     0,
      8433,  8449,    55,  8450,  8450,     0,  8451,  8454,    55,  8455,
      8455,     0,  8456,  8457,    55,  8458,  8467,     0,  8468,  8468,
        55,  8469,  8469,     0,  8470,  8472,    55,  8473,  8477,     0,
      8478,  8483,    55,  8484,  8484,     0,  8485,  8485,    55,  8486,
      8486,     0,  8487,  8487,    55,  8488,  8488,     0,  8489,  8489,
        55,  8490,  8493,     0,  8494,  8494,    55,  8495,  8505,     0,
      8506,  8507,    55,  8508,  8511,     0,  8512,  8516,    55,  8517,
      8521,     0,  8522,  8525,    55,  8526,  8526,     0,  8527,  8543,
        55,  8544,  8584,     0,  8585, 11263,    55, 11264, 11310,     0,
     11311, 11311,    55, 11312, 11358,     0, 11359, 11359,    55, 11360,
     11492,     0, 11493, 11498,    55, 11499, 11502,    56, 11503, 11505,
        55, 11506, 11507,     0, 11508, 11519,    55, 11520, 11557,     0,
     11558, 11558,    55, 11559, 11559,     0, 11560, 11564,    55, 11565,
     11565,     0, 11566, 11567,    55, 11568, 11623,     0, 11624, 11630,
        55, 11631, 11631,     0, 11632, 11646,    56, 11647, 11647,    55,
     11648, 11670,     0, 11671, 11679,    55, 11680, 11686,     0, 11687,
     11687,    55, 11688, 11694,     0, 11695, 11695,    55, 11696, 11702,
         0, 11703, 11703,    55, 11704, 11710,     0, 11711, 11711,    55,
     11712, 11718,     0, 11719, 11719,    55, 11720, 11726,     0, 11727,
     11727,    55, 11728, 11734,     0, 11735, 11735,    55, 11736, 11742,
         0, 11743, 11743,    56, 11744, 11775,     0, 11776, 11822,    55,
     11823, 11823,     0, 11824, 12292,    55, 12293, 12295,     0, 12296,
     12320,    55, 12321, 12329,    56, 12330, 12335,     0, 12336, 12336,
        55, 12337, 12341,     0, 12342, 12343,    55, 12344, 12348,     0,
     12349, 12352,    55, 12353, 12438,     0, 12439, 12440,    56, 12441,
     12442,     0, 12443, 12444,    55, 12445, 12447,     0, 12448, 12448,
        55, 12449, 12538,     0, 12539, 12539,    55, 12540, 12543,     0,
     12544, 12548,    55, 12549, 12589,     0, 12590, 12592,    55, 12593,
     12686,     0, 12687, 12703,    55, 12704, 12730,     0, 12731, 12783,
        55, 12784, 12799,     0, 12800, 13311,    55, 13312, 19893,     0,
     19894, 19967,    55, 19968, 40908,     0, 40909, 40959,    55, 40960,
     42124,     0, 42125, 42191,    55, 42192, 42237,     0, 42238, 42239,
        55, 42240, 42508,     0, 42509, 42511,    55, 42512, 42527,    56,
     42528, 42537,    55, 42538, 42539,     0, 42540, 42559,    55, 42560,
     42606,    56, 42607, 42607,     0, 42608, 42611,    56, 42612, 42621,
         0, 42622, 42622,    55, 42623, 42647,     0, 42648, 42654,    56,
     42655, 42655,    55, 42656, 42735,    56, 42736, 42737,     0, 42738,
     42774,    55, 42775, 42783,     0, 42784, 42785,    55, 42786, 42888,
         0, 42889, 42890,    55, 42891, 42894,     0, 42895, 42895,    55,
     42896, 42899,     0, 42900, 42911,    55, 42912, 42922,     0, 42923,
     42999,    55, 43000, 43009,    56, 43010, 43010,    55, 43011, 43013,
        56, 43014, 43014,    55, 43015, 43018,    56, 43019, 43019,    55,
     43020, 43042,    56, 43043, 43047,     0, 43048, 43071,    55, 43072,
     43123,     0, 43124, 43135,    56, 43136, 43137,    55, 43138, 43187,
        56, 43188, 43204,     0, 43205, 43215,    56, 43216, 43225,     0,
     43226, 43231,    56, 43232, 43249,    55, 43250, 43255,     0, 43256,
     43258,    55, 43259, 43259,     0, 43260, 43263,    56, 43264, 43273,
        55, 43274, 43301,    56, 43302, 43309,     0, 43310, 43311,    55,
     43312, 43334,    56, 43335, 43347,     0, 43348, 43359,    55, 43360,
     43388,     0, 43389, 43391,    56, 43392, 43395,    55, 43396, 43442,
        56, 43443, 43456,     0, 43457, 43470,    55, 43471, 43471,    56,
     43472, 43481,     0, 43482, 43519,    55, 43520, 43560,    56, 43561,
     43574,     0, 43575, 43583,    55, 43584, 43586,    56, 43587, 43587,
        55, 43588, 43595,    56, 43596, 43597,     0, 43598, 43599,    56,
     43600, 43609,     0, 43610, 43615,    55, 43616, 43638,     0, 43639,
     43641,    55, 43642, 43642,    56, 43643, 43643,     0, 43644, 43647,
        55, 43648, 43695,    56, 43696, 43696,    55, 43697, 43697,    56,
     43698, 43700,    55, 43701, 43702,    56, 43703, 43704,    55, 43705,
     43709,    56, 43710, 43711,    55, 43712, 43712,    56, 43713, 43713,
        55, 43714, 43714,     0, 43715, 43738,    55, 43739, 43741,     0,
     43742, 43743,    55, 43744, 43754,    56, 43755, 43759,     0, 43760,
     43761,    55, 43762, 43764,    56, 43765, 43766,     0, 43767, 43776,
        55, 43777, 43782,     0, 43783, 43784,    55, 43785, 43790,     0,
     43791, 43792,    55, 43793, 43798,     0, 43799, 43807,    55, 43808,
     43814,     0, 43815, 43815,    55, 43816, 43822,     0, 43823, 43967,
        55, 43968, 44002,    56, 44003, 44010,     0, 44011, 44011,    56,
     44012, 44013,     0, 44014, 44015,    56, 44016, 44025,     0, 44026,
     44031,    55, 44032, 55203,     0, 55204, 55215,    55, 55216, 55238,
         0, 55239, 55242,    55, 55243, 55291,     0, 55292, 63743,    55,
     63744, 64109,     0, 64110, 64111,    55, 64112, 64217,     0, 64218,
     64255,    55, 64256, 64262,     0, 64263, 64274,    55, 64275, 64279,
         0, 64280, 64284,    55, 64285, 64285,    56, 64286, 64286,    55,
     64287, 64296,     0, 64297, 64297,    55, 64298, 64310,     0, 64311,
     64311,    55, 64312, 64316,     0, 64317, 64317,    55, 64318, 64318,
         0, 64319, 64319,    55, 64320, 64321,     0, 64322, 64322,    55,
     64323, 64324,     0, 64325, 64325,    55, 64326, 64433,     0, 64434,
     64466,    55, 64467, 64829,     0, 64830, 64847,    55, 64848, 64911,
         0, 64912, 64913,    55, 64914, 64967,     0, 64968, 65007,    55,
     65008, 65019,     0, 65020, 65023,    56, 65024, 65039,     0, 65040,
     65055,    56, 65056, 65062,     0, 65063, 65074,    56, 65075, 65076,
         0, 65077, 65100,    56, 65101, 65103,     0, 65104, 65135,    55,
     65136, 65140,     0, 65141, 65141,    55, 65142, 65276,     0, 65277,
     65295,    56, 65296, 65305,     0, 65306, 65312,    55, 65313, 65338,
         0, 65339, 65342,    56, 65343, 65343,     0, 65344, 65344,    55,
     65345, 65370,     0, 65371, 65381,    55, 65382, 65470,     0, 65471,
     65473,    55, 65474, 65479,     0, 65480, 65481,    55, 65482, 65487,
         0, 65488, 65489,    55, 65490, 65495,     0, 65496, 65497,    55,
     65498, 65500,     0, 65501,Infinity,
]; 
var jjlexisEnd0: number[] = [ 
    0,1,1,1,0,1,1,0,0,1,1,1,1,1,1,
    0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,
    0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
    0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,
    0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,
    0,0,1,1,1,1,0,1,1,0,1,1,0,0,0,
    0,0,1,0,1,0,1,
]; 
var jjlexhasArc0: number[] = [ 
    1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,
    1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,
    1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,
    1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
    1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,
    1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,
    1,1,0,1,0,0,1,0,0,1,0,0,1,1,1,
    1,1,0,1,0,1,0,
]; 
var jjlextable0: DFATable = {
    pnext: jjlexpnext0,
    disnext: jjlexdisnext0,
    checknext: jjlexchecknext0,
    maxAsicii: 255,
    classTable: jjlexclassTable0,
    unicodeClassTable: jjlexunicodeClassTable0,
    isEnd: jjlexisEnd0,
    hasArc: jjlexhasArc0
};
var jjlexpnext1: number[] = [ 
         1,     2,     3,     4,     1,     1,     6,     7,     5,     1,
         7,     8,     1,    -1,     7,     5,     1,     7,
]; 
var jjlexdisnext1: number[] = [ 
         0,    12,    -5,     5,     7,    14,    -5,     5,    -5,
]; 
var jjlexchecknext1: number[] = [ 
         0,     0,     0,     0,     0,     7,     3,     4,     7,     7,
         4,     4,     1,    -1,     5,     1,     1,     5,
]; 
var jjlexclassTable1: number[] = [ 
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         1,     0,     0,     2,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     3,     0,     0,     0,     0,     4,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,
]; 
var jjlexunicodeClassTable1: number[] = [ 
         0,   256,Infinity,
]; 
var jjlexisEnd1: number[] = [ 
    0,1,1,1,0,0,1,1,1,
]; 
var jjlexhasArc1: number[] = [ 
    1,1,0,1,1,1,0,1,0,
]; 
var jjlextable1: DFATable = {
    pnext: jjlexpnext1,
    disnext: jjlexdisnext1,
    checknext: jjlexchecknext1,
    maxAsicii: 255,
    classTable: jjlexclassTable1,
    unicodeClassTable: jjlexunicodeClassTable1,
    isEnd: jjlexisEnd1,
    hasArc: jjlexhasArc1
};
var jjlexpnext2: number[] = [ 
         9,     9,     9,     9,    10,    10,     1,     2,     3,     4,
         5,     6,     9,     9,     9,     9,     1,     1,     8,     7,
         7,
]; 
var jjlexdisnext2: number[] = [ 
         6,    17,    -6,    17,     0,    -6,    -6,    12,    -6,    16,
        -6,
]; 
var jjlexchecknext2: number[] = [ 
         4,     4,     4,     4,     4,     4,     0,     0,     0,     0,
         0,     0,     7,     7,     7,     7,     9,     1,     3,     9,
         1,
]; 
var jjlexclassTable2: number[] = [ 
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         1,     0,     0,     2,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     3,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     4,     0,     5,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,
]; 
var jjlexunicodeClassTable2: number[] = [ 
         0,   256,Infinity,
]; 
var jjlexisEnd2: number[] = [ 
    0,1,1,1,0,1,1,0,1,1,1,
]; 
var jjlexhasArc2: number[] = [ 
    1,1,0,1,1,0,0,1,0,1,0,
]; 
var jjlextable2: DFATable = {
    pnext: jjlexpnext2,
    disnext: jjlexdisnext2,
    checknext: jjlexchecknext2,
    maxAsicii: 255,
    classTable: jjlexclassTable2,
    unicodeClassTable: jjlexunicodeClassTable2,
    isEnd: jjlexisEnd2,
    hasArc: jjlexhasArc2
};
var jjlexpnext3: number[] = [ 
        16,    16,    16,    17,    16,    16,    16,    16,    16,    16,
        16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
        17,    17,    16,    16,     1,     2,     3,     4,     1,     1,
         1,     1,     5,     1,     1,     1,     1,     1,     1,     1,
         1,     1,     1,     1,     6,     7,     1,     1,    18,    18,
        18,     9,    18,    18,    18,    18,    18,    18,    18,    18,
        18,    18,    18,    18,    18,    18,    18,    18,    -1,    -1,
        18,    18,    16,    16,    16,    -1,    16,    16,    16,    16,
        16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
        16,    16,    -1,    10,    16,    16,    35,    40,    10,    41,
        42,    12,    42,    42,    42,    42,    42,    42,    42,    42,
        42,    42,    42,    -1,    10,    43,    44,    35,    40,    10,
        41,    42,    12,    42,    42,    42,    42,    42,    42,    42,
        42,    42,    42,    42,    -1,    10,    43,    44,    35,    40,
        10,    41,    42,    12,    42,    42,    42,    42,    42,    42,
        42,    42,    42,    42,    42,    -1,    10,    43,    44,    35,
        40,    10,    41,    42,    12,    42,    42,    42,    42,    42,
        42,    42,    42,    42,    42,    42,    -1,    10,    43,    44,
        35,    40,    10,    41,    42,    12,    42,    42,    42,    42,
        42,    42,    42,    42,    42,    42,    42,    -1,    10,    43,
        44,    35,    40,    10,    41,    42,    12,    42,    42,    42,
        42,    42,    42,    42,    42,    42,    42,    42,    -1,    10,
        43,    44,    31,    10,    10,    10,    32,    12,    32,    32,
        32,    32,    32,    32,    32,    32,    32,    32,    32,    -1,
        10,    33,    10,    11,    10,    10,    10,    10,    12,    10,
        10,    10,    13,    10,    10,    10,    14,    10,    10,    15,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    45,    10,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    34,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    30,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    29,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    28,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    27,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        26,    10,    10,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    25,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    24,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    23,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    22,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
         1,    -1,    10,    10,     1,     1,     1,     1,     8,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        10,    -1,     1,     1,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    21,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    20,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    19,    10,    10,    10,
        10,    -1,    10,    10,    10,    10,    10,    10,    12,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
         1,    -1,    10,    10,     1,     1,     1,     1,     8,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        -1,    -1,     1,     1,    35,    36,    -1,    37,    35,    -1,
        35,    35,    35,    35,    35,    35,    35,    35,    35,    35,
        35,    -1,    -1,    38,    39,    35,    36,    -1,    37,    35,
        -1,    35,    35,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    -1,    -1,    38,    39,    35,    36,    -1,    37,
        35,    -1,    35,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    -1,    -1,    38,    39,    35,    36,    -1,
        37,    35,    -1,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    35,    -1,    -1,    38,    39,    35,    36,
        -1,    37,    35,    -1,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    35,    35,    -1,    -1,    38,    39,
]; 
var jjlexdisnext3: number[] = [ 
        24,   600,   -24,    50,   240,     0,   -24,   -24,    72,   -24,
       580,   -24,    48,   560,   540,   520,   500,   -24,   480,   460,
       440,   420,   400,   380,   360,   340,   320,   300,   219,   280,
       -24,   705,   198,   177,   260,   684,   663,   -24,   642,   621,
       156,   -24,   135,   114,    93,   -24,
]; 
var jjlexchecknext3: number[] = [ 
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
         5,     5,     5,     5,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,    12,    12,
        12,     3,    12,    12,    12,    12,    12,    12,    12,    12,
        12,    12,    12,    12,    12,    12,    12,    12,    -1,    -1,
        12,    12,     8,     8,     8,    -1,     8,     8,     8,     8,
         8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
         8,     8,    -1,    44,     8,     8,    44,    44,    44,    44,
        44,    44,    44,    44,    44,    44,    44,    44,    44,    44,
        44,    44,    44,    -1,    43,    44,    44,    43,    43,    43,
        43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
        43,    43,    43,    43,    -1,    42,    43,    43,    42,    42,
        42,    42,    42,    42,    42,    42,    42,    42,    42,    42,
        42,    42,    42,    42,    42,    -1,    40,    42,    42,    40,
        40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
        40,    40,    40,    40,    40,    40,    -1,    33,    40,    40,
        33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
        33,    33,    33,    33,    33,    33,    33,    -1,    32,    33,
        33,    32,    32,    32,    32,    32,    32,    32,    32,    32,
        32,    32,    32,    32,    32,    32,    32,    32,    -1,    28,
        32,    32,    28,    28,    28,    28,    28,    28,    28,    28,
        28,    28,    28,    28,    28,    28,    28,    28,    28,    -1,
         4,    28,    28,     4,     4,     4,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
        34,    -1,     4,     4,    34,    34,    34,    34,    34,    34,
        34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
        29,    -1,    34,    34,    29,    29,    29,    29,    29,    29,
        29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
        27,    -1,    29,    29,    27,    27,    27,    27,    27,    27,
        27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
        26,    -1,    27,    27,    26,    26,    26,    26,    26,    26,
        26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
        25,    -1,    26,    26,    25,    25,    25,    25,    25,    25,
        25,    25,    25,    25,    25,    25,    25,    25,    25,    25,
        24,    -1,    25,    25,    24,    24,    24,    24,    24,    24,
        24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
        23,    -1,    24,    24,    23,    23,    23,    23,    23,    23,
        23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
        22,    -1,    23,    23,    22,    22,    22,    22,    22,    22,
        22,    22,    22,    22,    22,    22,    22,    22,    22,    22,
        21,    -1,    22,    22,    21,    21,    21,    21,    21,    21,
        21,    21,    21,    21,    21,    21,    21,    21,    21,    21,
        20,    -1,    21,    21,    20,    20,    20,    20,    20,    20,
        20,    20,    20,    20,    20,    20,    20,    20,    20,    20,
        19,    -1,    20,    20,    19,    19,    19,    19,    19,    19,
        19,    19,    19,    19,    19,    19,    19,    19,    19,    19,
        18,    -1,    19,    19,    18,    18,    18,    18,    18,    18,
        18,    18,    18,    18,    18,    18,    18,    18,    18,    18,
        16,    -1,    18,    18,    16,    16,    16,    16,    16,    16,
        16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
        15,    -1,    16,    16,    15,    15,    15,    15,    15,    15,
        15,    15,    15,    15,    15,    15,    15,    15,    15,    15,
        14,    -1,    15,    15,    14,    14,    14,    14,    14,    14,
        14,    14,    14,    14,    14,    14,    14,    14,    14,    14,
        13,    -1,    14,    14,    13,    13,    13,    13,    13,    13,
        13,    13,    13,    13,    13,    13,    13,    13,    13,    13,
        10,    -1,    13,    13,    10,    10,    10,    10,    10,    10,
        10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
         1,    -1,    10,    10,     1,     1,     1,     1,     1,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        -1,    -1,     1,     1,    39,    39,    -1,    39,    39,    -1,
        39,    39,    39,    39,    39,    39,    39,    39,    39,    39,
        39,    -1,    -1,    39,    39,    38,    38,    -1,    38,    38,
        -1,    38,    38,    38,    38,    38,    38,    38,    38,    38,
        38,    38,    -1,    -1,    38,    38,    36,    36,    -1,    36,
        36,    -1,    36,    36,    36,    36,    36,    36,    36,    36,
        36,    36,    36,    -1,    -1,    36,    36,    35,    35,    -1,
        35,    35,    -1,    35,    35,    35,    35,    35,    35,    35,
        35,    35,    35,    35,    -1,    -1,    35,    35,    31,    31,
        -1,    31,    31,    -1,    31,    31,    31,    31,    31,    31,
        31,    31,    31,    31,    31,    -1,    -1,    31,    31,
]; 
var jjlexclassTable3: number[] = [ 
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         1,     0,     0,     2,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     3,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     4,     0,     0,
         5,     0,     6,     0,     0,     7,     7,     7,     7,     7,
         7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
         7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
         7,     0,     8,     0,     0,     7,     0,     9,     7,    10,
        11,    12,     7,     7,    13,    14,     7,    15,     7,    16,
        17,    18,     7,     7,     7,     7,    19,     7,     7,     7,
         7,     7,     7,    20,     0,    21,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        22,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,    22,     0,     0,     0,     0,    22,     0,     0,     0,
         0,     0,    22,    22,    22,    22,    22,    22,    22,    22,
        22,    22,    22,    22,    22,    22,    22,    22,    22,    22,
        22,    22,    22,    22,    22,     0,    22,    22,    22,    22,
        22,    22,    22,    22,    22,    22,    22,    22,    22,    22,
        22,    22,    22,    22,    22,    22,    22,    22,    22,    22,
        22,    22,    22,    22,    22,    22,    22,     0,    22,    22,
        22,    22,    22,    22,    22,    22,
]; 
var jjlexunicodeClassTable3: number[] = [ 
        22,   256,   705,     0,   706,   709,    22,   710,   721,     0,
       722,   735,    22,   736,   740,     0,   741,   747,    22,   748,
       748,     0,   749,   749,    22,   750,   750,     0,   751,   767,
        23,   768,   879,    22,   880,   884,     0,   885,   885,    22,
       886,   887,     0,   888,   889,    22,   890,   893,     0,   894,
       901,    22,   902,   902,     0,   903,   903,    22,   904,   906,
         0,   907,   907,    22,   908,   908,     0,   909,   909,    22,
       910,   929,     0,   930,   930,    22,   931,  1013,     0,  1014,
      1014,    22,  1015,  1153,     0,  1154,  1154,    23,  1155,  1159,
         0,  1160,  1161,    22,  1162,  1319,     0,  1320,  1328,    22,
      1329,  1366,     0,  1367,  1368,    22,  1369,  1369,     0,  1370,
      1376,    22,  1377,  1415,     0,  1416,  1424,    23,  1425,  1469,
         0,  1470,  1470,    23,  1471,  1471,     0,  1472,  1472,    23,
      1473,  1474,     0,  1475,  1475,    23,  1476,  1477,     0,  1478,
      1478,    23,  1479,  1479,     0,  1480,  1487,    22,  1488,  1514,
         0,  1515,  1519,    22,  1520,  1522,     0,  1523,  1551,    23,
      1552,  1562,     0,  1563,  1567,    22,  1568,  1610,    23,  1611,
      1641,     0,  1642,  1645,    22,  1646,  1647,    23,  1648,  1648,
        22,  1649,  1747,     0,  1748,  1748,    22,  1749,  1749,    23,
      1750,  1756,     0,  1757,  1758,    23,  1759,  1764,    22,  1765,
      1766,    23,  1767,  1768,     0,  1769,  1769,    23,  1770,  1773,
        22,  1774,  1775,    23,  1776,  1785,    22,  1786,  1788,     0,
      1789,  1790,    22,  1791,  1791,     0,  1792,  1807,    22,  1808,
      1808,    23,  1809,  1809,    22,  1810,  1839,    23,  1840,  1866,
         0,  1867,  1868,    22,  1869,  1957,    23,  1958,  1968,    22,
      1969,  1969,     0,  1970,  1983,    23,  1984,  1993,    22,  1994,
      2026,    23,  2027,  2035,    22,  2036,  2037,     0,  2038,  2041,
        22,  2042,  2042,     0,  2043,  2047,    22,  2048,  2069,    23,
      2070,  2073,    22,  2074,  2074,    23,  2075,  2083,    22,  2084,
      2084,    23,  2085,  2087,    22,  2088,  2088,    23,  2089,  2093,
         0,  2094,  2111,    22,  2112,  2136,    23,  2137,  2139,     0,
      2140,  2207,    22,  2208,  2208,     0,  2209,  2209,    22,  2210,
      2220,     0,  2221,  2275,    23,  2276,  2302,     0,  2303,  2303,
        23,  2304,  2307,    22,  2308,  2361,    23,  2362,  2364,    22,
      2365,  2365,    23,  2366,  2383,    22,  2384,  2384,    23,  2385,
      2391,    22,  2392,  2401,    23,  2402,  2403,     0,  2404,  2405,
        23,  2406,  2415,     0,  2416,  2416,    22,  2417,  2423,     0,
      2424,  2424,    22,  2425,  2431,     0,  2432,  2432,    23,  2433,
      2435,     0,  2436,  2436,    22,  2437,  2444,     0,  2445,  2446,
        22,  2447,  2448,     0,  2449,  2450,    22,  2451,  2472,     0,
      2473,  2473,    22,  2474,  2480,     0,  2481,  2481,    22,  2482,
      2482,     0,  2483,  2485,    22,  2486,  2489,     0,  2490,  2491,
        23,  2492,  2492,    22,  2493,  2493,    23,  2494,  2500,     0,
      2501,  2502,    23,  2503,  2504,     0,  2505,  2506,    23,  2507,
      2509,    22,  2510,  2510,     0,  2511,  2518,    23,  2519,  2519,
         0,  2520,  2523,    22,  2524,  2525,     0,  2526,  2526,    22,
      2527,  2529,    23,  2530,  2531,     0,  2532,  2533,    23,  2534,
      2543,    22,  2544,  2545,     0,  2546,  2560,    23,  2561,  2563,
         0,  2564,  2564,    22,  2565,  2570,     0,  2571,  2574,    22,
      2575,  2576,     0,  2577,  2578,    22,  2579,  2600,     0,  2601,
      2601,    22,  2602,  2608,     0,  2609,  2609,    22,  2610,  2611,
         0,  2612,  2612,    22,  2613,  2614,     0,  2615,  2615,    22,
      2616,  2617,     0,  2618,  2619,    23,  2620,  2620,     0,  2621,
      2621,    23,  2622,  2626,     0,  2627,  2630,    23,  2631,  2632,
         0,  2633,  2634,    23,  2635,  2637,     0,  2638,  2640,    23,
      2641,  2641,     0,  2642,  2648,    22,  2649,  2652,     0,  2653,
      2653,    22,  2654,  2654,     0,  2655,  2661,    23,  2662,  2673,
        22,  2674,  2676,    23,  2677,  2677,     0,  2678,  2688,    23,
      2689,  2691,     0,  2692,  2692,    22,  2693,  2701,     0,  2702,
      2702,    22,  2703,  2705,     0,  2706,  2706,    22,  2707,  2728,
         0,  2729,  2729,    22,  2730,  2736,     0,  2737,  2737,    22,
      2738,  2739,     0,  2740,  2740,    22,  2741,  2745,     0,  2746,
      2747,    23,  2748,  2748,    22,  2749,  2749,    23,  2750,  2757,
         0,  2758,  2758,    23,  2759,  2761,     0,  2762,  2762,    23,
      2763,  2765,     0,  2766,  2767,    22,  2768,  2768,     0,  2769,
      2783,    22,  2784,  2785,    23,  2786,  2787,     0,  2788,  2789,
        23,  2790,  2799,     0,  2800,  2816,    23,  2817,  2819,     0,
      2820,  2820,    22,  2821,  2828,     0,  2829,  2830,    22,  2831,
      2832,     0,  2833,  2834,    22,  2835,  2856,     0,  2857,  2857,
        22,  2858,  2864,     0,  2865,  2865,    22,  2866,  2867,     0,
      2868,  2868,    22,  2869,  2873,     0,  2874,  2875,    23,  2876,
      2876,    22,  2877,  2877,    23,  2878,  2884,     0,  2885,  2886,
        23,  2887,  2888,     0,  2889,  2890,    23,  2891,  2893,     0,
      2894,  2901,    23,  2902,  2903,     0,  2904,  2907,    22,  2908,
      2909,     0,  2910,  2910,    22,  2911,  2913,    23,  2914,  2915,
         0,  2916,  2917,    23,  2918,  2927,     0,  2928,  2928,    22,
      2929,  2929,     0,  2930,  2945,    23,  2946,  2946,    22,  2947,
      2947,     0,  2948,  2948,    22,  2949,  2954,     0,  2955,  2957,
        22,  2958,  2960,     0,  2961,  2961,    22,  2962,  2965,     0,
      2966,  2968,    22,  2969,  2970,     0,  2971,  2971,    22,  2972,
      2972,     0,  2973,  2973,    22,  2974,  2975,     0,  2976,  2978,
        22,  2979,  2980,     0,  2981,  2983,    22,  2984,  2986,     0,
      2987,  2989,    22,  2990,  3001,     0,  3002,  3005,    23,  3006,
      3010,     0,  3011,  3013,    23,  3014,  3016,     0,  3017,  3017,
        23,  3018,  3021,     0,  3022,  3023,    22,  3024,  3024,     0,
      3025,  3030,    23,  3031,  3031,     0,  3032,  3045,    23,  3046,
      3055,     0,  3056,  3072,    23,  3073,  3075,     0,  3076,  3076,
        22,  3077,  3084,     0,  3085,  3085,    22,  3086,  3088,     0,
      3089,  3089,    22,  3090,  3112,     0,  3113,  3113,    22,  3114,
      3123,     0,  3124,  3124,    22,  3125,  3129,     0,  3130,  3132,
        22,  3133,  3133,    23,  3134,  3140,     0,  3141,  3141,    23,
      3142,  3144,     0,  3145,  3145,    23,  3146,  3149,     0,  3150,
      3156,    23,  3157,  3158,     0,  3159,  3159,    22,  3160,  3161,
         0,  3162,  3167,    22,  3168,  3169,    23,  3170,  3171,     0,
      3172,  3173,    23,  3174,  3183,     0,  3184,  3201,    23,  3202,
      3203,     0,  3204,  3204,    22,  3205,  3212,     0,  3213,  3213,
        22,  3214,  3216,     0,  3217,  3217,    22,  3218,  3240,     0,
      3241,  3241,    22,  3242,  3251,     0,  3252,  3252,    22,  3253,
      3257,     0,  3258,  3259,    23,  3260,  3260,    22,  3261,  3261,
        23,  3262,  3268,     0,  3269,  3269,    23,  3270,  3272,     0,
      3273,  3273,    23,  3274,  3277,     0,  3278,  3284,    23,  3285,
      3286,     0,  3287,  3293,    22,  3294,  3294,     0,  3295,  3295,
        22,  3296,  3297,    23,  3298,  3299,     0,  3300,  3301,    23,
      3302,  3311,     0,  3312,  3312,    22,  3313,  3314,     0,  3315,
      3329,    23,  3330,  3331,     0,  3332,  3332,    22,  3333,  3340,
         0,  3341,  3341,    22,  3342,  3344,     0,  3345,  3345,    22,
      3346,  3386,     0,  3387,  3388,    22,  3389,  3389,    23,  3390,
      3396,     0,  3397,  3397,    23,  3398,  3400,     0,  3401,  3401,
        23,  3402,  3405,    22,  3406,  3406,     0,  3407,  3414,    23,
      3415,  3415,     0,  3416,  3423,    22,  3424,  3425,    23,  3426,
      3427,     0,  3428,  3429,    23,  3430,  3439,     0,  3440,  3449,
        22,  3450,  3455,     0,  3456,  3457,    23,  3458,  3459,     0,
      3460,  3460,    22,  3461,  3478,     0,  3479,  3481,    22,  3482,
      3505,     0,  3506,  3506,    22,  3507,  3515,     0,  3516,  3516,
        22,  3517,  3517,     0,  3518,  3519,    22,  3520,  3526,     0,
      3527,  3529,    23,  3530,  3530,     0,  3531,  3534,    23,  3535,
      3540,     0,  3541,  3541,    23,  3542,  3542,     0,  3543,  3543,
        23,  3544,  3551,     0,  3552,  3569,    23,  3570,  3571,     0,
      3572,  3584,    22,  3585,  3632,    23,  3633,  3633,    22,  3634,
      3635,    23,  3636,  3642,     0,  3643,  3647,    22,  3648,  3654,
        23,  3655,  3662,     0,  3663,  3663,    23,  3664,  3673,     0,
      3674,  3712,    22,  3713,  3714,     0,  3715,  3715,    22,  3716,
      3716,     0,  3717,  3718,    22,  3719,  3720,     0,  3721,  3721,
        22,  3722,  3722,     0,  3723,  3724,    22,  3725,  3725,     0,
      3726,  3731,    22,  3732,  3735,     0,  3736,  3736,    22,  3737,
      3743,     0,  3744,  3744,    22,  3745,  3747,     0,  3748,  3748,
        22,  3749,  3749,     0,  3750,  3750,    22,  3751,  3751,     0,
      3752,  3753,    22,  3754,  3755,     0,  3756,  3756,    22,  3757,
      3760,    23,  3761,  3761,    22,  3762,  3763,    23,  3764,  3769,
         0,  3770,  3770,    23,  3771,  3772,    22,  3773,  3773,     0,
      3774,  3775,    22,  3776,  3780,     0,  3781,  3781,    22,  3782,
      3782,     0,  3783,  3783,    23,  3784,  3789,     0,  3790,  3791,
        23,  3792,  3801,     0,  3802,  3803,    22,  3804,  3807,     0,
      3808,  3839,    22,  3840,  3840,     0,  3841,  3863,    23,  3864,
      3865,     0,  3866,  3871,    23,  3872,  3881,     0,  3882,  3892,
        23,  3893,  3893,     0,  3894,  3894,    23,  3895,  3895,     0,
      3896,  3896,    23,  3897,  3897,     0,  3898,  3901,    23,  3902,
      3903,    22,  3904,  3911,     0,  3912,  3912,    22,  3913,  3948,
         0,  3949,  3952,    23,  3953,  3972,     0,  3973,  3973,    23,
      3974,  3975,    22,  3976,  3980,    23,  3981,  3991,     0,  3992,
      3992,    23,  3993,  4028,     0,  4029,  4037,    23,  4038,  4038,
         0,  4039,  4095,    22,  4096,  4138,    23,  4139,  4158,    22,
      4159,  4159,    23,  4160,  4169,     0,  4170,  4175,    22,  4176,
      4181,    23,  4182,  4185,    22,  4186,  4189,    23,  4190,  4192,
        22,  4193,  4193,    23,  4194,  4196,    22,  4197,  4198,    23,
      4199,  4205,    22,  4206,  4208,    23,  4209,  4212,    22,  4213,
      4225,    23,  4226,  4237,    22,  4238,  4238,    23,  4239,  4253,
         0,  4254,  4255,    22,  4256,  4293,     0,  4294,  4294,    22,
      4295,  4295,     0,  4296,  4300,    22,  4301,  4301,     0,  4302,
      4303,    22,  4304,  4346,     0,  4347,  4347,    22,  4348,  4680,
         0,  4681,  4681,    22,  4682,  4685,     0,  4686,  4687,    22,
      4688,  4694,     0,  4695,  4695,    22,  4696,  4696,     0,  4697,
      4697,    22,  4698,  4701,     0,  4702,  4703,    22,  4704,  4744,
         0,  4745,  4745,    22,  4746,  4749,     0,  4750,  4751,    22,
      4752,  4784,     0,  4785,  4785,    22,  4786,  4789,     0,  4790,
      4791,    22,  4792,  4798,     0,  4799,  4799,    22,  4800,  4800,
         0,  4801,  4801,    22,  4802,  4805,     0,  4806,  4807,    22,
      4808,  4822,     0,  4823,  4823,    22,  4824,  4880,     0,  4881,
      4881,    22,  4882,  4885,     0,  4886,  4887,    22,  4888,  4954,
         0,  4955,  4956,    23,  4957,  4959,     0,  4960,  4991,    22,
      4992,  5007,     0,  5008,  5023,    22,  5024,  5108,     0,  5109,
      5120,    22,  5121,  5740,     0,  5741,  5742,    22,  5743,  5759,
         0,  5760,  5760,    22,  5761,  5786,     0,  5787,  5791,    22,
      5792,  5866,     0,  5867,  5869,    22,  5870,  5872,     0,  5873,
      5887,    22,  5888,  5900,     0,  5901,  5901,    22,  5902,  5905,
        23,  5906,  5908,     0,  5909,  5919,    22,  5920,  5937,    23,
      5938,  5940,     0,  5941,  5951,    22,  5952,  5969,    23,  5970,
      5971,     0,  5972,  5983,    22,  5984,  5996,     0,  5997,  5997,
        22,  5998,  6000,     0,  6001,  6001,    23,  6002,  6003,     0,
      6004,  6015,    22,  6016,  6067,    23,  6068,  6099,     0,  6100,
      6102,    22,  6103,  6103,     0,  6104,  6107,    22,  6108,  6108,
        23,  6109,  6109,     0,  6110,  6111,    23,  6112,  6121,     0,
      6122,  6154,    23,  6155,  6157,     0,  6158,  6159,    23,  6160,
      6169,     0,  6170,  6175,    22,  6176,  6263,     0,  6264,  6271,
        22,  6272,  6312,    23,  6313,  6313,    22,  6314,  6314,     0,
      6315,  6319,    22,  6320,  6389,     0,  6390,  6399,    22,  6400,
      6428,     0,  6429,  6431,    23,  6432,  6443,     0,  6444,  6447,
        23,  6448,  6459,     0,  6460,  6469,    23,  6470,  6479,    22,
      6480,  6509,     0,  6510,  6511,    22,  6512,  6516,     0,  6517,
      6527,    22,  6528,  6571,     0,  6572,  6575,    23,  6576,  6592,
        22,  6593,  6599,    23,  6600,  6601,     0,  6602,  6607,    23,
      6608,  6617,     0,  6618,  6655,    22,  6656,  6678,    23,  6679,
      6683,     0,  6684,  6687,    22,  6688,  6740,    23,  6741,  6750,
         0,  6751,  6751,    23,  6752,  6780,     0,  6781,  6782,    23,
      6783,  6793,     0,  6794,  6799,    23,  6800,  6809,     0,  6810,
      6822,    22,  6823,  6823,     0,  6824,  6911,    23,  6912,  6916,
        22,  6917,  6963,    23,  6964,  6980,    22,  6981,  6987,     0,
      6988,  6991,    23,  6992,  7001,     0,  7002,  7018,    23,  7019,
      7027,     0,  7028,  7039,    23,  7040,  7042,    22,  7043,  7072,
        23,  7073,  7085,    22,  7086,  7087,    23,  7088,  7097,    22,
      7098,  7141,    23,  7142,  7155,     0,  7156,  7167,    22,  7168,
      7203,    23,  7204,  7223,     0,  7224,  7231,    23,  7232,  7241,
         0,  7242,  7244,    22,  7245,  7247,    23,  7248,  7257,    22,
      7258,  7293,     0,  7294,  7375,    23,  7376,  7378,     0,  7379,
      7379,    23,  7380,  7400,    22,  7401,  7404,    23,  7405,  7405,
        22,  7406,  7409,    23,  7410,  7412,    22,  7413,  7414,     0,
      7415,  7423,    22,  7424,  7615,    23,  7616,  7654,     0,  7655,
      7675,    23,  7676,  7679,    22,  7680,  7957,     0,  7958,  7959,
        22,  7960,  7965,     0,  7966,  7967,    22,  7968,  8005,     0,
      8006,  8007,    22,  8008,  8013,     0,  8014,  8015,    22,  8016,
      8023,     0,  8024,  8024,    22,  8025,  8025,     0,  8026,  8026,
        22,  8027,  8027,     0,  8028,  8028,    22,  8029,  8029,     0,
      8030,  8030,    22,  8031,  8061,     0,  8062,  8063,    22,  8064,
      8116,     0,  8117,  8117,    22,  8118,  8124,     0,  8125,  8125,
        22,  8126,  8126,     0,  8127,  8129,    22,  8130,  8132,     0,
      8133,  8133,    22,  8134,  8140,     0,  8141,  8143,    22,  8144,
      8147,     0,  8148,  8149,    22,  8150,  8155,     0,  8156,  8159,
        22,  8160,  8172,     0,  8173,  8177,    22,  8178,  8180,     0,
      8181,  8181,    22,  8182,  8188,     0,  8189,  8203,    23,  8204,
      8205,     0,  8206,  8254,    23,  8255,  8256,     0,  8257,  8275,
        23,  8276,  8276,     0,  8277,  8304,    22,  8305,  8305,     0,
      8306,  8318,    22,  8319,  8319,     0,  8320,  8335,    22,  8336,
      8348,     0,  8349,  8399,    23,  8400,  8412,     0,  8413,  8416,
        23,  8417,  8417,     0,  8418,  8420,    23,  8421,  8432,     0,
      8433,  8449,    22,  8450,  8450,     0,  8451,  8454,    22,  8455,
      8455,     0,  8456,  8457,    22,  8458,  8467,     0,  8468,  8468,
        22,  8469,  8469,     0,  8470,  8472,    22,  8473,  8477,     0,
      8478,  8483,    22,  8484,  8484,     0,  8485,  8485,    22,  8486,
      8486,     0,  8487,  8487,    22,  8488,  8488,     0,  8489,  8489,
        22,  8490,  8493,     0,  8494,  8494,    22,  8495,  8505,     0,
      8506,  8507,    22,  8508,  8511,     0,  8512,  8516,    22,  8517,
      8521,     0,  8522,  8525,    22,  8526,  8526,     0,  8527,  8543,
        22,  8544,  8584,     0,  8585, 11263,    22, 11264, 11310,     0,
     11311, 11311,    22, 11312, 11358,     0, 11359, 11359,    22, 11360,
     11492,     0, 11493, 11498,    22, 11499, 11502,    23, 11503, 11505,
        22, 11506, 11507,     0, 11508, 11519,    22, 11520, 11557,     0,
     11558, 11558,    22, 11559, 11559,     0, 11560, 11564,    22, 11565,
     11565,     0, 11566, 11567,    22, 11568, 11623,     0, 11624, 11630,
        22, 11631, 11631,     0, 11632, 11646,    23, 11647, 11647,    22,
     11648, 11670,     0, 11671, 11679,    22, 11680, 11686,     0, 11687,
     11687,    22, 11688, 11694,     0, 11695, 11695,    22, 11696, 11702,
         0, 11703, 11703,    22, 11704, 11710,     0, 11711, 11711,    22,
     11712, 11718,     0, 11719, 11719,    22, 11720, 11726,     0, 11727,
     11727,    22, 11728, 11734,     0, 11735, 11735,    22, 11736, 11742,
         0, 11743, 11743,    23, 11744, 11775,     0, 11776, 11822,    22,
     11823, 11823,     0, 11824, 12292,    22, 12293, 12295,     0, 12296,
     12320,    22, 12321, 12329,    23, 12330, 12335,     0, 12336, 12336,
        22, 12337, 12341,     0, 12342, 12343,    22, 12344, 12348,     0,
     12349, 12352,    22, 12353, 12438,     0, 12439, 12440,    23, 12441,
     12442,     0, 12443, 12444,    22, 12445, 12447,     0, 12448, 12448,
        22, 12449, 12538,     0, 12539, 12539,    22, 12540, 12543,     0,
     12544, 12548,    22, 12549, 12589,     0, 12590, 12592,    22, 12593,
     12686,     0, 12687, 12703,    22, 12704, 12730,     0, 12731, 12783,
        22, 12784, 12799,     0, 12800, 13311,    22, 13312, 19893,     0,
     19894, 19967,    22, 19968, 40908,     0, 40909, 40959,    22, 40960,
     42124,     0, 42125, 42191,    22, 42192, 42237,     0, 42238, 42239,
        22, 42240, 42508,     0, 42509, 42511,    22, 42512, 42527,    23,
     42528, 42537,    22, 42538, 42539,     0, 42540, 42559,    22, 42560,
     42606,    23, 42607, 42607,     0, 42608, 42611,    23, 42612, 42621,
         0, 42622, 42622,    22, 42623, 42647,     0, 42648, 42654,    23,
     42655, 42655,    22, 42656, 42735,    23, 42736, 42737,     0, 42738,
     42774,    22, 42775, 42783,     0, 42784, 42785,    22, 42786, 42888,
         0, 42889, 42890,    22, 42891, 42894,     0, 42895, 42895,    22,
     42896, 42899,     0, 42900, 42911,    22, 42912, 42922,     0, 42923,
     42999,    22, 43000, 43009,    23, 43010, 43010,    22, 43011, 43013,
        23, 43014, 43014,    22, 43015, 43018,    23, 43019, 43019,    22,
     43020, 43042,    23, 43043, 43047,     0, 43048, 43071,    22, 43072,
     43123,     0, 43124, 43135,    23, 43136, 43137,    22, 43138, 43187,
        23, 43188, 43204,     0, 43205, 43215,    23, 43216, 43225,     0,
     43226, 43231,    23, 43232, 43249,    22, 43250, 43255,     0, 43256,
     43258,    22, 43259, 43259,     0, 43260, 43263,    23, 43264, 43273,
        22, 43274, 43301,    23, 43302, 43309,     0, 43310, 43311,    22,
     43312, 43334,    23, 43335, 43347,     0, 43348, 43359,    22, 43360,
     43388,     0, 43389, 43391,    23, 43392, 43395,    22, 43396, 43442,
        23, 43443, 43456,     0, 43457, 43470,    22, 43471, 43471,    23,
     43472, 43481,     0, 43482, 43519,    22, 43520, 43560,    23, 43561,
     43574,     0, 43575, 43583,    22, 43584, 43586,    23, 43587, 43587,
        22, 43588, 43595,    23, 43596, 43597,     0, 43598, 43599,    23,
     43600, 43609,     0, 43610, 43615,    22, 43616, 43638,     0, 43639,
     43641,    22, 43642, 43642,    23, 43643, 43643,     0, 43644, 43647,
        22, 43648, 43695,    23, 43696, 43696,    22, 43697, 43697,    23,
     43698, 43700,    22, 43701, 43702,    23, 43703, 43704,    22, 43705,
     43709,    23, 43710, 43711,    22, 43712, 43712,    23, 43713, 43713,
        22, 43714, 43714,     0, 43715, 43738,    22, 43739, 43741,     0,
     43742, 43743,    22, 43744, 43754,    23, 43755, 43759,     0, 43760,
     43761,    22, 43762, 43764,    23, 43765, 43766,     0, 43767, 43776,
        22, 43777, 43782,     0, 43783, 43784,    22, 43785, 43790,     0,
     43791, 43792,    22, 43793, 43798,     0, 43799, 43807,    22, 43808,
     43814,     0, 43815, 43815,    22, 43816, 43822,     0, 43823, 43967,
        22, 43968, 44002,    23, 44003, 44010,     0, 44011, 44011,    23,
     44012, 44013,     0, 44014, 44015,    23, 44016, 44025,     0, 44026,
     44031,    22, 44032, 55203,     0, 55204, 55215,    22, 55216, 55238,
         0, 55239, 55242,    22, 55243, 55291,     0, 55292, 63743,    22,
     63744, 64109,     0, 64110, 64111,    22, 64112, 64217,     0, 64218,
     64255,    22, 64256, 64262,     0, 64263, 64274,    22, 64275, 64279,
         0, 64280, 64284,    22, 64285, 64285,    23, 64286, 64286,    22,
     64287, 64296,     0, 64297, 64297,    22, 64298, 64310,     0, 64311,
     64311,    22, 64312, 64316,     0, 64317, 64317,    22, 64318, 64318,
         0, 64319, 64319,    22, 64320, 64321,     0, 64322, 64322,    22,
     64323, 64324,     0, 64325, 64325,    22, 64326, 64433,     0, 64434,
     64466,    22, 64467, 64829,     0, 64830, 64847,    22, 64848, 64911,
         0, 64912, 64913,    22, 64914, 64967,     0, 64968, 65007,    22,
     65008, 65019,     0, 65020, 65023,    23, 65024, 65039,     0, 65040,
     65055,    23, 65056, 65062,     0, 65063, 65074,    23, 65075, 65076,
         0, 65077, 65100,    23, 65101, 65103,     0, 65104, 65135,    22,
     65136, 65140,     0, 65141, 65141,    22, 65142, 65276,     0, 65277,
     65295,    23, 65296, 65305,     0, 65306, 65312,    22, 65313, 65338,
         0, 65339, 65342,    23, 65343, 65343,     0, 65344, 65344,    22,
     65345, 65370,     0, 65371, 65381,    22, 65382, 65470,     0, 65471,
     65473,    22, 65474, 65479,     0, 65480, 65481,    22, 65482, 65487,
         0, 65488, 65489,    22, 65490, 65495,     0, 65496, 65497,    22,
     65498, 65500,     0, 65501,Infinity,
]; 
var jjlexisEnd3: number[] = [ 
    0,1,1,1,1,0,1,1,0,1,1,1,0,1,1,
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    1,0,1,1,1,0,0,1,0,0,1,1,1,1,1,
    1,
]; 
var jjlexhasArc3: number[] = [ 
    1,1,0,1,1,1,0,0,1,0,1,0,1,1,1,
    1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,
    0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,
    0,
]; 
var jjlextable3: DFATable = {
    pnext: jjlexpnext3,
    disnext: jjlexdisnext3,
    checknext: jjlexchecknext3,
    maxAsicii: 255,
    classTable: jjlexclassTable3,
    unicodeClassTable: jjlexunicodeClassTable3,
    isEnd: jjlexisEnd3,
    hasArc: jjlexhasArc3
};
var jjlexpnext4: number[] = [ 
         1,     2,     3,     4,     1,
]; 
var jjlexdisnext4: number[] = [ 
         0,     4,    -3,     2,    -3,
]; 
var jjlexchecknext4: number[] = [ 
         0,     0,     0,     3,     1,
]; 
var jjlexclassTable4: number[] = [ 
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         1,     0,     0,     2,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,
]; 
var jjlexunicodeClassTable4: number[] = [ 
         0,   256,Infinity,
]; 
var jjlexisEnd4: number[] = [ 
    0,1,1,1,1,
]; 
var jjlexhasArc4: number[] = [ 
    1,1,0,1,0,
]; 
var jjlextable4: DFATable = {
    pnext: jjlexpnext4,
    disnext: jjlexdisnext4,
    checknext: jjlexchecknext4,
    maxAsicii: 255,
    classTable: jjlexclassTable4,
    unicodeClassTable: jjlexunicodeClassTable4,
    isEnd: jjlexisEnd4,
    hasArc: jjlexhasArc4
};
/*
    dfa tables
*/
var jjdfaTables: DFATable[] = [
    jjlextable0,
    jjlextable1,
    jjlextable2,
    jjlextable3,
    jjlextable4,
];
/*
    find unicode class
*/
function jjfindUnicodeClass(uc: number[], c: number){
    for(var i = 0; i < uc.length; i += 3){
        if(c >= uc[i + 1] && c <= uc[i + 2]){
            return uc[i];
        }
        else if(c < uc[i + 1]){
            return -1;
        }
    }
    return -1;
}
/*
    tokens that a lexical dfa state can return
*/
var jjlexTokens0: number[] = [ 
        -1,     2,     2,     2,    -1,     3,     4,    -1,    -1,    29,
        30,    35,    36,    44,    37,    -1,    38,    40,    28,    31,
        27,    34,    32,    33,    43,     6,    42,     7,     4,     2,
        -1,     5,    -1,     3,     4,     4,     4,     4,    41,    -1,
        -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
        -1,     5,    -1,     3,     3,    39,    -1,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,     9,    -1,    -1,    -1,    -1,    -1,
        -1,    -1,    -1,    14,    -1,    -1,    -1,    -1,    -1,    -1,
        -1,    20,    -1,    11,    -1,    -1,    -1,    19,    -1,    -1,
        -1,    18,    -1,    -1,    17,    -1,    -1,    -1,    24,    -1,
        -1,    -1,    12,    10,    26,    25,    -1,    15,    22,    -1,
         8,    21,    -1,    -1,    -1,    -1,    -1,    13,    -1,    16,
        -1,    23,
]; 
var jjlexTokens1: number[] = [ 
        -1,     3,     3,     3,    -1,    -1,     3,     3,     3,
]; 
var jjlexTokens2: number[] = [ 
        -1,    45,    45,    45,    -1,     6,     7,    -1,    45,    45,
        45,
]; 
var jjlexTokens3: number[] = [ 
        -1,    45,    45,    45,    45,    -1,     6,     7,    -1,    45,
        45,    46,    -1,    45,    45,    45,    45,    45,    45,    45,
        45,    45,    45,    45,    45,    45,    45,    45,    45,    45,
        47,    -1,    45,    45,    45,    -1,    -1,    49,    -1,    -1,
        45,    49,    45,    45,    45,    48,
]; 
var jjlexTokens4: number[] = [ 
        -1,    45,    45,    45,    45,
]; 

var jjstateCount = 221;
var jjtokenCount = 50;
var jjactERR = 222;
/*
    compressed action table: action = jjpact[jjdisact[STATE-NUM] + TOKEN]
    when action > 0, shift the token and goto state (action - 1);
    when action < 0, reduce with rule (1-action);
    when action = 0, do default action.
*/
var jjpact: number[] = [ 
         9,     7,    15,    18,    19,    20,   127,    10,    11,   109,
        12,   182,    13,    14,   215,    16,   204,   220,    17,   185,
       128,   204,   217,   214,  -101,   134,   -63,   211,   181,   -63,
       157,   146,    75,     5,   180,   178,   143,   144,   179,   145,
       134,   -63,   190,   191,   189,  -101,   146,  -101,   123,    76,
       -64,   143,   144,   -64,   145,   205,   200,   201,   202,   203,
       205,   200,   201,   202,   203,   -64,   120,   123,   -48,    81,
       118,   122,    81,    78,   115,   -48,  -115,   123,  -115,    29,
       123,    29,   123,    91,    24,    85,    89,    86,    63,   123,
       122,    62,    57,    58,   117,   210,   209,   171,   207,   197,
       122,   171,   195,   122,   194,   122,   156,   184,   205,   183,
       175,   205,   122,   174,   140,   134,   161,   160,   159,   158,
       154,    42,   -48,   150,   149,   148,   117,   140,   117,   137,
      -108,   135,   131,   130,   129,   124,   113,   112,   107,   103,
       101,   100,   211,    94,    93,    88,    84,    32,    82,    77,
        70,    67,    66,    65,    61,    59,    53,    52,    51,    32,
        46,    39,    38,    36,    32,    32,    32,    32,    30,    24,
         4,
]; 
/*
    displacement of action table.
*/
var jjdisact: number[] = [ 
       -50,   170,    -8,   -50,   165,   -50,   -50,    77,   162,   161,
       160,   159,   158,   158,   134,   132,    84,   -50,   -50,   -50,
        80,   -50,   -50,   -50,   132,    75,   -50,   -50,   -50,   -50,
       -50,   -50,   -50,   -50,   153,   -50,   130,   153,   152,    72,
       -50,   -50,   -50,    54,   149,   150,   -50,    84,   -50,   -50,
       149,   125,   121,   -50,   105,   -50,   -50,   -50,   -50,     5,
       -50,   -50,   118,    66,   121,   -50,   141,   -50,   101,   -50,
        45,   -50,   131,    79,   -50,   140,   138,   -50,   -50,    97,
       -50,   -50,   -50,   -50,   -50,   -50,   124,   111,   -50,   -50,
       -50,   111,   -50,   -50,   -50,   -50,   -50,   119,     5,   -50,
       133,   105,    70,    63,   -50,    36,    62,   -50,   104,    43,
       -24,   -50,   106,   106,    94,   -50,   -50,   -50,   -50,   -50,
       -50,   127,   -50,   126,   -50,   -50,   -50,   125,   104,    89,
       102,   -50,   -50,   -50,    98,   120,   -50,    96,   -50,    90,
        93,   -50,   115,   -50,   114,   112,   -50,   -50,   -50,   -50,
       -50,    84,    90,    76,   -50,   -50,    15,   -50,   -50,   -50,
         0,   -50,   107,   -50,    68,    23,   -50,     6,    65,   -50,
        70,   -50,   -14,   -50,   -50,   -50,     8,   -50,    63,   100,
        73,   -50,    96,    94,   -50,   -50,    -1,   -50,   -50,   -50,
       -50,    68,    92,    69,    90,   -50,   -50,   -50,   -18,   -50,
       -50,   -50,   -50,   -50,   -50,   -50,   -50,   -10,   -50,   -16,
       -50,   -50,    15,   -50,   -50,   -50,   -50,    10,   -50,   -50,
       -50,
]; 
/*
    used to check if a position in jjpact is out of bouds.
    if jjcheckact[jjdisact[STATE-NUM] + TOKEN] = STATE-NUM, this position is not out of bounds.
*/
var jjcheckact: number[] = [ 
         2,     2,     2,     2,     2,     2,   110,     2,     2,    98,
         2,   167,     2,     2,   209,     2,   217,   217,     2,   172,
       110,   212,   212,   207,    98,   160,   186,   198,   167,   186,
       172,   160,    59,     2,   167,   167,   160,   160,   167,   160,
       156,   186,   176,   176,   176,    98,   156,    98,   109,    59,
       165,   156,   156,   165,   156,   217,   217,   217,   217,   217,
       212,   212,   212,   212,   212,   165,   106,   106,   105,   103,
       103,   109,    63,    63,   102,   109,   105,    39,   105,    25,
        25,     7,     7,    73,    20,    70,    73,    70,    47,    16,
       106,    47,    43,    43,   102,   194,   193,   192,   191,   183,
        39,   182,   180,    25,   179,     7,   178,   170,   103,   168,
       164,    63,    16,   162,   153,   152,   151,   145,   144,   142,
       140,    20,   139,   137,   135,   134,   130,   129,   128,   127,
       123,   121,   114,   113,   112,   108,   101,   100,    97,    91,
        87,    86,    79,    76,    75,    72,    68,    66,    64,    62,
        54,    52,    51,    50,    45,    44,    38,    37,    36,    34,
        24,    15,    14,    13,    12,    11,    10,     9,     8,     4,
         1,
]; 
/*
    default action table. action = jjdefred[STATE-NUM],
    where action is the number of the rule to reduce with.
*/
var jjdefred: number[] = [ 
         4,    -1,    -1,     0,    -1,     3,     5,    -1,    -1,    -1,
        -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,
        -1,    86,    87,    88,    35,     7,    29,    30,    31,    33,
         9,   118,    10,    11,    -1,    13,    14,    -1,    -1,    16,
        20,     1,    85,    -1,    -1,    -1,    28,    -1,   122,    12,
        -1,    -1,    -1,    19,    21,    94,    90,    91,    39,    -1,
        36,     8,    -1,    -1,    -1,    18,    -1,     2,    22,    24,
        -1,    93,    97,    44,    34,    -1,    -1,   119,   121,   123,
       124,    17,    15,    23,    89,    94,   103,    -1,     6,    38,
        40,    -1,    37,    32,   120,   122,    92,   113,   105,   101,
        -1,    -1,    60,    -1,    95,    49,    -1,   102,   106,    49,
        -1,    99,    -1,    -1,    -1,    58,    60,   125,   115,   116,
       117,    -1,   112,   104,   109,   110,    96,    -1,    60,    46,
        60,    59,   126,   131,    -1,    -1,    98,    -1,    42,    49,
        -1,    52,    -1,    54,    -1,    -1,    57,   111,   108,    41,
        45,    -1,   132,    46,    66,    77,   132,    53,    55,    56,
       132,    50,    -1,    43,    61,    66,    65,    -1,    79,    82,
        83,    51,    -1,   127,    66,    64,    71,    60,    78,    -1,
        -1,    76,    -1,    -1,    48,   128,    66,    67,    68,    69,
        70,    -1,    80,    -1,    -1,    81,    84,   133,   135,   136,
       137,   138,   139,   140,   145,   134,    72,    -1,    74,    -1,
       144,   141,    -1,    73,    75,   134,   129,    -1,   130,   142,
       143,
]; 
/*
    compressed goto table: goto = jjpgoto[jjdisgoto[STATE-NUM] + NON_TERMINAL]
*/
var jjpgoto: number[] = [ 
         5,   197,   176,   197,   171,   198,     7,   198,   172,   141,
       118,   151,   152,   113,   115,   154,   109,   107,    25,    26,
       175,   167,   187,   175,   167,   125,   151,   152,   120,    78,
       104,   105,    86,    78,    55,    46,    44,   218,   215,   195,
       192,   138,    79,   146,    53,    39,    79,   162,   146,    89,
        34,    91,   162,    42,    22,    33,    32,    30,   124,    24,
       163,    27,   207,   168,   169,   161,   150,   151,   152,   162,
       140,   115,   154,   137,   115,   154,   135,    27,   110,    97,
        98,    96,    72,    82,    67,    68,    59,    49,    36,    20,
        21,    22,    40,     1,   220,     2,   217,   212,   211,   205,
       191,   154,   186,   166,   167,   185,   164,   165,   166,   167,
       132,   131,   154,   103,   101,    95,    94,    73,    70,    71,
        72,    63,    54,    48,    47,    43,
]; 
/*
    displacement of the goto table
*/
var jjdisgoto: number[] = [ 
        92,   -75,    -4,   -75,    50,   -75,    54,     7,   -75,     0,
        -1,    -2,    -7,   -75,    82,   -75,    38,   -75,   -75,   -75,
        13,   -75,   -75,    83,    22,    23,   -75,   -75,   -75,   111,
       -75,    65,   -75,   -75,    30,   -75,   -75,   -75,   -75,   -10,
       -75,   120,   -75,    -9,   -75,    71,   -75,   -75,    61,   -75,
       -75,   -75,   -75,   -75,    76,    74,   -75,   -75,   101,   -75,
       -75,   -75,   -75,   -28,   -75,   -75,    26,   -75,   -75,   -75,
       -75,   -75,   -15,    32,   -75,   -75,   -75,    57,   -75,   -75,
        53,   -75,   -75,   -75,   -75,    36,    30,   -75,   -75,   -75,
        96,   -75,   -75,   -75,   -75,    53,   -75,   -25,   -35,   -75,
        30,   -75,   -13,   -32,   -75,   -11,   -26,   -75,   -75,     4,
       -75,   -75,   -75,   -75,   -75,   -75,    84,    47,   -75,   -75,
       -75,   -75,   -75,    23,   -75,   -75,   -75,   -75,    47,    21,
        44,   -75,   -75,   -75,   -75,   -75,   -75,   -75,   -75,    45,
       -75,   -75,   -75,   -75,   -75,   -75,   -75,   -75,   -75,   -75,
       -75,   -75,     1,    40,    77,   -75,   -21,   -75,   -75,   -75,
       -16,   -75,   -75,   -75,   -75,    -8,   -75,   -32,   -75,   -75,
       -75,   -75,   -75,    40,    72,   -75,   -11,    73,     5,   -75,
       -75,   -75,     1,   -75,   -75,    33,   -11,   -75,   -75,   -75,
       -75,   -75,    26,   -75,   -75,   -75,   -75,   -75,   -75,   -75,
       -75,   -75,   -75,    27,   -75,    28,   -75,   -75,   -75,   -75,
       -75,   -34,   -67,   -75,   -75,    27,   -30,   -69,   -75,    21,
       -75,
]; 
/*
    length of each rule: rule length = jjruleLen[RULE-NUM]
*/
var jjruleLen: number[] = [ 
         2,     0,     6,     2,     0,     0,     6,     2,     4,     2,
         2,     2,     3,     2,     2,     5,     2,     4,     3,     2,
         1,     0,     1,     2,     1,     1,     1,     1,     2,     1,
         1,     1,     4,     0,     3,     0,     1,     3,     2,     0,
         0,     6,     5,     7,     0,     2,     0,     0,     4,     0,
         2,     3,     1,     2,     1,     2,     2,     1,     1,     2,
         0,     2,     3,     1,     2,     1,     0,     3,     1,     1,
         1,     0,     3,     4,     3,     4,     1,     1,     0,     1,
         0,     3,     1,     1,     3,     2,     1,     1,     0,     5,
         1,     1,     3,     1,     0,     4,     4,     0,     3,     1,
         1,     1,     2,     0,     2,     0,     1,     0,     4,     2,
         2,     3,     1,     0,     1,     2,     2,     2,     0,     0,
         5,     2,     0,     1,     0,     0,     5,     0,     0,     0,
         7,     1,     0,     2,     0,     1,     1,     1,     1,     1,
         0,     0,     0,     6,     2,     1,
]; 
/*
    index of the LHS of each rule
*/
var jjlhs: number[] = [ 
         0,     2,     1,     3,     3,     5,     4,     4,     4,     4,
         4,     4,     4,     4,     4,     4,     4,     6,     6,     7,
         7,     8,     8,     9,     9,    10,    10,    10,    11,    11,
        12,    12,    13,    13,    14,    14,    15,    15,    16,    16,
        18,    17,    17,    17,    19,    20,    20,    22,    21,    23,
        21,    24,    24,    25,    25,    25,    25,    25,    26,    26,
        28,    27,    29,    29,    30,    30,    32,    31,    33,    33,
        33,    33,    34,    34,    34,    34,    34,    35,    35,    36,
        36,    37,    37,    38,    38,    39,    39,    40,    42,    41,
        43,    43,    44,    44,    46,    45,    47,    47,    48,    48,
        49,    49,    50,    50,    51,    51,    52,    53,    52,    52,
        52,    54,    54,    55,    55,    55,    56,    56,    58,    59,
        57,    60,    60,    61,    62,    63,    61,    65,    66,    67,
        64,    68,    68,    69,    69,    70,    70,    70,    70,    70,
        71,    72,    73,    70,    74,    74,
]; 
/*
    token names
*/
var jjtokenNames: string[] = [ 
                   "EOF",             "ERROR",        "WHITESPACE",
               "COMMENT",              "NAME",            "STRING",
            "OPEN_BLOCK",       "CLOSE_BLOCK",           "OPT_DIR",
               "LEX_DIR",         "TOKEN_DIR",          "LEFT_DIR",
             "RIGHT_DIR",      "NONASSOC_DIR",           "USE_DIR",
            "HEADER_DIR",     "EXTRA_ARG_DIR",             "EMPTY",
              "TYPE_DIR",          "PREC_DIR",          "INIT_DIR",
            "OUTPUT_DIR",        "IMPORT_DIR",    "TOKEN_HOOK_DIR",
             "LEAST_DIR",        "ALWAYS_DIR",         "TOUCH_DIR",
                    "GT",                "LT",               "BRA",
                   "KET",               "EQU",              "CBRA",
                  "CKET",          "QUESTION",              "STAR",
                  "PLUS",              "DASH",             "COLON",
                 "ARROW",               "EOL",         "SEPERATOR",
                    "OR",             "WEDGE",             "COMMA",
              "ANY_CODE",           "LHS_REF",         "TOKEN_REF",
               "MATCHED",        "EMIT_TOKEN",
]; 
/*
    token alias
*/
var jjtokenAlias: string[] = [ 
                    null,                null,                null,
                    "/*",                null,                null,
                     "{",                 "}",           "%option",
                  "%lex",            "%token",             "%left",
                "%right",         "%nonassoc",              "%use",
               "%header",        "%extra_arg",            "%empty",
                 "%type",             "%prec",             "%init",
               "%output",           "%import",       "%token_hook",
                "%least",           "%always",            "%touch",
                     ">",                 "<",                 "(",
                     ")",                 "=",                 "[",
                     "]",                 "?",                 "*",
                     "+",                 "-",                 ":",
                    "=>",                 ";",                "%%",
                     "|",                 "^",                 ",",
                    null,                "$$",            "$token",
              "$matched",                null,
]; 


function tokenToString(tk: number){
    return jjtokenAlias[tk] === null ? `<${jjtokenNames[tk]}>` : `"${jjtokenAlias[tk]}"`;
}
function getExpectedTokens(state: number): number[]{
        var dis = jjdisact[state];
        var ret: number[] = [];
        function expect(tk: number){
            var ind = dis + tk;
            if(ind < 0 || ind >= jjpact.length || state !== jjcheckact[ind]){
                return jjdefred[state] !== -1;
            }
            else {
                return true;
            }
        }
        for(var tk = 0; tk < jjtokenCount; tk++){
            expect(tk) && ret.push(tk);
        }
        return ret;
}
// Token kinds
enum TokenKind {
    EOF = 0,
    ERROR = 1,
    WHITESPACE = 2,
    COMMENT = 3,
    NAME = 4,
    STRING = 5,
    OPEN_BLOCK = 6,
    CLOSE_BLOCK = 7,
    OPT_DIR = 8,
    LEX_DIR = 9,
    TOKEN_DIR = 10,
    LEFT_DIR = 11,
    RIGHT_DIR = 12,
    NONASSOC_DIR = 13,
    USE_DIR = 14,
    HEADER_DIR = 15,
    EXTRA_ARG_DIR = 16,
    EMPTY = 17,
    TYPE_DIR = 18,
    PREC_DIR = 19,
    INIT_DIR = 20,
    OUTPUT_DIR = 21,
    IMPORT_DIR = 22,
    TOKEN_HOOK_DIR = 23,
    LEAST_DIR = 24,
    ALWAYS_DIR = 25,
    TOUCH_DIR = 26,
    GT = 27,
    LT = 28,
    BRA = 29,
    KET = 30,
    EQU = 31,
    CBRA = 32,
    CKET = 33,
    QUESTION = 34,
    STAR = 35,
    PLUS = 36,
    DASH = 37,
    COLON = 38,
    ARROW = 39,
    EOL = 40,
    SEPERATOR = 41,
    OR = 42,
    WEDGE = 43,
    COMMA = 44,
    ANY_CODE = 45,
    LHS_REF = 46,
    TOKEN_REF = 47,
    MATCHED = 48,
    EMIT_TOKEN = 49,

};
class Token {
    constructor(
        public id: number,
        public val: string,
        public startLine: number,
        public startColumn: number,
        public endLine: number,
        public endColumn: number
    ){}
    clone(){
        return new Token(
            this.id,
            this.val,
            this.startLine,
            this.startColumn,
            this.endLine,
            this.endColumn
        );
    }
    toString(){
        return (jjtokenAlias[this.id] === null ? 
            `<${jjtokenNames[this.id]}>` :
            `"${jjtokenAlias[this.id]}"`) + `("${this.val}")`;
    }
}
interface Parser{
    init(ctx1: Context, b: GBuilder);
    accept(s: string);
    end();
    parse(input: ParserInput | string): boolean;
    load(input: ParserInput | string);
    nextToken(): Token;

    setLineTerminator(lt: LineTerm);
    getLineTerminator(): LineTerm;
    halt();
    on(ent: 'lexicalerror', cb: (c: string, line: number, col: number) => any);
    on(ent: 'syntaxerror', cb: (t: Token, state: number) => any);
    on(ent: 'accept', cb: () => any);

    enableBlocks();
    disableBlocks();
    loadParserState(state: ParserState);
    getParserState(): ParserState;
}
interface ParserState {
    lexState: number[];
    lrState: number[];
    sematicS: JNode[];
};
interface ParserInput {
    current(): number;
    next();
    isEof(): boolean;
    backup(s: string);
};
enum LineTerm{
    NONE = 1,
    AUTO,
    CR,
    LF,
    CRLF
};

function createParser(): Parser {
    //#region parser state variables
    var jjlexState: number[];
    var jjstate: number;
    var jjlastCR: boolean;
    var jjmatched: string;
    var jjmarker: { state: number, line: number, column: number } = { state: -1, line: 0, column: 0 };
    var jjbackupCount: number;
    var jjline: number;
    var jjcolumn: number;
    var jjtline: number;
    var jjtcolumn: number;

    var jjlrState: number[];
    var jjsematicS: JNode[];
    //#endregion

    var jjinput: ParserInput;
    var jjsematicVal: JNode;
    var jjtokenQueue: Token[];
    var jjtoken: Token;
    var jjstop: boolean;
    var jjtokenEmitted: boolean;
    var jjenableBlock: boolean = true;
    var jjlineTerm: LineTerm;

    var jjhandlers: {[s: string]: ((a1?, a2?, a3?) => any)[]} = {};

    // extra members, defined by %extra_arg
    
    let gb: GBuilder;
    let ctx: Context;
    let assoc: Assoc;
    let lexact: LexAction;
    let ruleLhs: JNode;
    let least: boolean;
    let always: boolean;


    return {
        init,
        on,
        setLineTerminator,
        getLineTerminator: () => jjlineTerm,
        accept,
        end,
        load,
        parse,
        nextToken,
        halt,
        enableBlocks,
        disableBlocks,
        loadParserState,
        getParserState
    };
    function init(ctx1: Context, b: GBuilder){
        jjlexState = [ 0 ];// DEFAULT
        jjstate = 0;
        jjmatched = '';
        jjtoken = new Token(-1, null, 0, 0, 0, 0);
        jjmarker.state = -1;
        jjbackupCount = 0;
        jjline = jjtline = 0;
        jjcolumn = jjtcolumn = 0;
        
        jjlrState = [ 0 ];
        jjsematicS = [];
        jjsematicVal = null;
        jjtokenQueue = [];

        jjlineTerm = LineTerm.AUTO;
        jjlastCR = false;

        
    gb = b;
    ctx = ctx1;


        jjtryReduce();
    }
    function load(input: ParserInput | string){
        if(typeof input === 'string'){
            var i = 0;
            var s: string = input;
            jjinput = {
                current: () => i < s.length ? s.charCodeAt(i) : null,
                next: () => i++,
                isEof: () => i >= s.length,
                backup: t => i -= t.length
            }
        }
        else {
            jjinput = input;
        }
    }
    function nextToken(): Token{
        jjtokenEmitted = false;
        while(!jjstop && !jjtokenEmitted){
            var c = jjinput.current();
            if(c !== null){
                jjacceptChar(c);
            }
            // null means end of file or no input available at present
            else if(jjinput.isEof()){
                if(jjacceptEOF()){
                    break;
                }
            }
            else {
                return null;
            }
        }
        return jjtoken;
    }
    function setLineTerminator(lt: LineTerm){
        jjlineTerm = lt;
    }
    function enableBlocks(){
        jjenableBlock = true;
    }
    function disableBlocks(){
        jjenableBlock = false;
    }
    /**
     *  input a string
     *  @api public
     *  @deprecated
     */
    function accept(s: string){
        var i = 0;
        load({
            current: () => i < s.length ? s.charCodeAt(i) : null,
            next: () => i++,
            isEof: () => i >= s.length,
            backup: t => i -= t.length
        });
        while(!jjstop && nextToken().id !== 0);
    }
    /**
     *  tell the compiler that end of file is reached
     *  @api public
     */
    function end(){
        
    }
    function parse(input: ParserInput | string): boolean {
        load(input);
        var t;
        while(!jjstop){
            t = nextToken();
            if(t === null){
                return false;
            }
            else if(t.id === 0){
                return true;
            }
        }
        return true;
    }
    function halt(){
        jjstop = true;
    }
    function loadParserState(state: ParserState){
        jjlexState = state.lexState;
        jjlrState = state.lrState;
        jjsematicS = state.sematicS;
    }
    function getParserState(): ParserState {
        return {
            lexState: jjlexState,
            lrState: jjlrState,
            sematicS: jjsematicS
        };
    }
    function jjtokenHook(token: Token): boolean{
        
    return (token.id === TokenKind.COMMENT || token.id === TokenKind.WHITESPACE);

    }
    /**
     *  set 
     */
    function jjsetImg(s: string){
        jjmatched = s;
        jjtline = jjline;
        jjtcolumn = jjcolumn;
    }
    function jjprepareToken(tid: number){
        jjtoken.id = tid;
        jjtoken.val = jjmatched;
        jjtoken.startLine = jjtline;
        jjtoken.startColumn = jjtcolumn;
        jjtoken.endLine = jjline;
        jjtoken.endColumn = jjcolumn - 1;

        if(!jjtokenHook(jjtoken)){
            jjtokenQueue.push(jjtoken);
        }

        jjtokenEmitted = true;
        jjmatched = '';
        jjtline = jjline;
        jjtcolumn = jjcolumn;
    }
    function jjemit(name: string, a1?, a2?, a3?){
        var cbs = jjhandlers[name];
        if(cbs){
            for(var i = 0; i < cbs.length; i++){
                cbs[i](a1, a2, a3);
            }
        }
    }
    function on(name: string, cb: (a1?, a2?, a3?) => any){
        jjhandlers[name] || (jjhandlers[name] = []);
        jjhandlers[name].push(cb);
    }
    function jjdoLexAction0(jjstaten: number){
        var jjtk = jjlexTokens0[jjstaten];
        jjtk !== -1 && jjprepareToken(jjtk);
        switch(jjstaten){
            case 6:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 25:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 27:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 28:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 31:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); jjsematicVal.val = unescape(jjsematicVal.val.substr(1, jjsematicVal.val.length - 2)); }
                break;
            case 34:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 35:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 36:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 37:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 51:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); jjsematicVal.val = unescape(jjsematicVal.val.substr(1, jjsematicVal.val.length - 2)); }
                break;
            case 53:
                jjlexState.push(1); 
                break;
            default:;
        }
    }
    function jjdoLexAction1(jjstaten: number){
        var jjtk = jjlexTokens1[jjstaten];
        jjtk !== -1 && jjprepareToken(jjtk);
        switch(jjstaten){
            case 8:
                jjlexState.pop(); 
                break;
            default:;
        }
    }
    function jjdoLexAction2(jjstaten: number){
        var jjtk = jjlexTokens2[jjstaten];
        jjtk !== -1 && jjprepareToken(jjtk);
        switch(jjstaten){
            case 1:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val); }
                break;
            case 2:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val); }
                break;
            case 3:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val); }
                break;
            case 5:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 6:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 8:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val); }
                break;
            case 9:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val); }
                break;
            case 10:
                if(jjenableBlock){ jjsematicVal = newNode(jjtoken.val.charAt(1)); }
                break;
            default:;
        }
    }
    function jjdoLexAction3(jjstaten: number){
        var jjtk = jjlexTokens3[jjstaten];
        jjtk !== -1 && jjprepareToken(jjtk);
        switch(jjstaten){
            case 1:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 2:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 3:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 4:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 6:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 7:
                if(jjenableBlock){ jjsematicVal = nodeFromTrivalToken(jjtoken); }
                break;
            case 9:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 10:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 13:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 14:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 15:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 16:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 17:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); jjsematicVal.val = jjsematicVal.val.charAt(1); }
                break;
            case 18:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 19:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 20:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 21:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 22:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 23:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 24:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 25:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 26:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 27:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 28:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 29:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 32:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 33:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 34:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 37:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); jjsematicVal.val = jjsematicVal.val.substr(6, jjsematicVal.val.length - 7); }
                break;
            case 40:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 41:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); jjsematicVal.val = jjsematicVal.val.substr(6, jjsematicVal.val.length - 7); }
                break;
            case 42:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 43:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 44:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            default:;
        }
    }
    function jjdoLexAction4(jjstaten: number){
        var jjtk = jjlexTokens4[jjstaten];
        jjtk !== -1 && jjprepareToken(jjtk);
        switch(jjstaten){
            case 1:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 2:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 3:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            case 4:
                if(jjenableBlock){ jjsematicVal = nodeFromToken(jjtoken); }
                break;
            default:;
        }
    }
    /**
     *  do a lexical action
     *  @api private
     *  @internal
     */
    function jjdoLexAction(lexstate: number, state: number){
        switch(lexstate){
            case 0:
                jjdoLexAction0(state);
                break;
            case 1:
                jjdoLexAction1(state);
                break;
            case 2:
                jjdoLexAction2(state);
                break;
            case 3:
                jjdoLexAction3(state);
                break;
            case 4:
                jjdoLexAction4(state);
                break;
            default:;
        }
        jjtokenQueue.length > 0 && jjacceptToken(null);
    }
    function jjrollback(){
        var ret = jjmatched.substr(jjmatched.length - jjbackupCount, jjbackupCount);
        jjinput.backup(ret);
        jjmatched = jjmatched.substr(0, jjmatched.length - jjbackupCount);
        jjbackupCount = 0;
        jjline = jjmarker.line;
        jjcolumn = jjmarker.column;
        jjstate = jjmarker.state;
        jjmarker.state = -1;
    }
    function jjmark(){
        jjmarker.state = jjstate;
        jjmarker.line = jjline;
        jjmarker.column = jjcolumn;
        jjbackupCount = 0;
    }
    function jjconsume(c: number){
        // c === jjeol ? (jjline++, jjcolumn = 0) : (jjcolumn += c > 0xff ? 2 : 1);
        switch(jjlineTerm){
            case LineTerm.NONE:
                jjcolumn += c > 0xff ? 2 : 1;
                break;
            case LineTerm.CR:
                c === jjcr ? (jjline++, jjcolumn = 0) : (jjcolumn += c > 0xff ? 2 : 1);
                break;
            case LineTerm.LF:
                c === jjlf ? (jjline++, jjcolumn = 0) : (jjcolumn += c > 0xff ? 2 : 1);
                break;
            case LineTerm.CRLF:
                if(jjlastCR){
                    if(c === jjlf){
                        jjline++, jjcolumn = 0;
                        jjlastCR = false;
                    }
                    else {
                        jjcolumn += c > 0xff ? 2 : 1;
                        jjlastCR = c === jjcr;
                    }
                }
                else {
                    jjcolumn += c > 0xff ? 2 : 1;
                    jjlastCR = c === jjcr;
                }
                break;
            case LineTerm.AUTO:
                if(jjlastCR){
                    if(c === jjlf){
                        jjline++, jjcolumn = 0;
                        jjlastCR = false;
                        jjlineTerm = LineTerm.CRLF;
                    }
                    else {
                        jjline++, jjcolumn = 0;
                        jjlineTerm = LineTerm.CR;
                        c === jjcr ? (jjline++, jjcolumn = 0) : (jjcolumn += c > 0xff ? 2 : 1);
                    }
                }
                else if(c === jjlf){
                    jjline++, jjcolumn = 0;
                    jjlineTerm = LineTerm.LF;
                }
                else {
                    jjcolumn += c > 0xff ? 2 : 1;
                    jjlastCR = c === jjcr;
                }
                break;
        }
        jjmatched += String.fromCharCode(c);
        jjmarker.state !== -1 && (jjbackupCount++);
        jjinput.next();
    }
    /**
     *  accept a character
     *  @return - true if the character is consumed, false if not consumed
     *  @api private
     *  @internal
     */
    function jjacceptChar(ccode: number){
        var lexstate = jjlexState[jjlexState.length - 1];
        var ltable = jjdfaTables[lexstate];
        var isEnd = ltable.isEnd[jjstate] === 1;
        var hasArc = ltable.hasArc[jjstate] === 1;
        // get the class of the given character
        var cl = ccode < ltable.maxAsicii ? ltable.classTable[ccode] : jjfindUnicodeClass(ltable.unicodeClassTable, ccode);
        // find the next state to go
        var nstate = -1;
        if(cl !== -1){
            var ind = ltable.disnext[jjstate] + cl;
            if(ind >= 0 && ind < ltable.pnext.length && ltable.checknext[ind] === jjstate){
                nstate = ltable.pnext[ind];
            }
        }
        if(isEnd){
            // if current state is a terminate state, be careful
            if(hasArc){
                if(nstate === -1){
                    // nowhere to go, stay where we are
                    jjdoLexAction(lexstate, jjstate);
                    // recover
                    jjmarker.state = -1;
                    jjbackupCount = 0;
                    jjstate = 0;                    
                    // character not consumed
                }
                else {
                    // now we can either go to that new state, or stay where we are
                    // it is prefered to move forward, but that could lead to errors,
                    // so we need to memorize this state before move on, in case if 
                    // an error occurs later, we could just return to this state.
                    jjmark();
                    jjstate = nstate;
                    jjconsume(ccode);
                    // check for terminate state
                    jjtryLexEnd();
                }
            }
            else {
                // current state doesn't lead to any state, just stay here.
                jjdoLexAction(lexstate, jjstate);
                // recover
                jjmarker.state = -1;
                jjbackupCount = 0;
                jjstate = 0;
                // character not consumed
            }
        }
        else {
            if(nstate === -1){
                // nowhere to go at current state, error may have occured.
                // check marker to verify that
                if(jjmarker.state !== -1){
                    // we have a previously marked state, which is a terminate state.
                    jjrollback();
                    jjdoLexAction(lexstate, jjstate);
                    jjstate = 0;
                    // accept(s);
                    // character not consumed
                }
                else {
                    // error occurs
                    jjemit('lexicalerror', String.fromCharCode(ccode), jjline, jjcolumn);
                    // force consume
                    jjconsume(ccode);
                    // emit an error token
                    jjprepareToken(1);
                    jjtokenQueue.length > 0 && jjacceptToken(null);
                    jjstate = 0;
                }
            }
            else {
                jjstate = nstate;
                // character consumed
                jjconsume(ccode);
                // check for terminate state
                jjtryLexEnd();
            }
        }
    }
    function jjacceptEOF(){
        if(jjstate === 0){
            // recover
            jjprepareToken(0);
            jjacceptToken(null);
            return true;
        }
        else {
            var lexstate = jjlexState[jjlexState.length - 1];
            var ltable = jjdfaTables[lexstate];
            var isEnd = ltable.isEnd[jjstate];
            if(isEnd){
                jjdoLexAction(lexstate, jjstate);
                jjstate = 0;
                jjmarker.state = -1;
                return false;
            }
            else if(jjmarker.state !== -1){
                jjrollback();
                jjdoLexAction(lexstate, jjstate);
                jjstate = 0;
                return false;
            }
            else {
                jjemit('lexicalerror', '', jjline, jjcolumn);
                jjprepareToken(1);
                jjtokenQueue.length > 0 && jjacceptToken(null);
                jjstate = 0;
                return true;
            }
        }
    }
    function jjtryLexEnd(){
        var lexstate = jjlexState[jjlexState.length - 1];
        var ltable = jjdfaTables[lexstate];
        var isEnd = ltable.isEnd[jjstate] === 1;
        var hasArc = ltable.hasArc[jjstate] === 1;
        if(isEnd && !hasArc){
            jjdoLexAction(lexstate, jjstate);
            jjmarker.state = -1;
            jjbackupCount = 0;
            jjstate = 0;
        }
    }
    function jjdoReduction(jjrulenum: number){
        var jjnt = jjlhs[jjrulenum];
        var jjsp = jjsematicS.length;
        var jjtop = jjsematicS[jjsp - jjruleLen[jjrulenum]] || null;
        switch(jjrulenum){
            case 1:
                /* 1: @0 => */
                jjlexState.push(4); 
                break;
            case 5:
                /* 5: @1 => */
                if(jjenableBlock){ gb.lexBuilder.prepareLex(); } 
                break;
            case 7:
                /* 7: option => associativeDir assocTokens */
                if(jjenableBlock){ gb.incPr(); } 
                break;
            case 9:
                /* 9: option => "%header" block */
                var b = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setHeader(b); } 
                break;
            case 10:
                /* 10: option => "%extra_arg" block */
                var b = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setExtraArg(b); } 
                break;
            case 11:
                /* 11: option => "%type" block */
                var ty = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setType(ty); } 
                break;
            case 12:
                /* 12: option => "%init" block block */
                var args = jjsematicS[jjsp - 2];
                var b = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setInit(args, b); } 
                break;
            case 13:
                /* 13: option => "%output" <STRING> */
                var op = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setOutput(op); } 
                break;
            case 15:
                /* 15: option => "%token_hook" "(" <NAME> ")" block */
                var arg = jjsematicS[jjsp - 3];
                var b = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setTokenHook(arg, b); } 
                break;
            case 17:
                /* 17: tokenDefs => tokenDefs "<" <NAME> ">" */
                var t = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.defToken(t, null); } 
                break;
            case 18:
                /* 18: tokenDefs => "<" <NAME> ">" */
                var t = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.defToken(t, null); } 
                break;
            case 19:
                /* 19: touchTokenList => touchTokenList tokenRef */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.touchToken(t, t.ext); } 
                break;
            case 20:
                /* 20: touchTokenList => tokenRef */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.touchToken(t, t.ext); } 
                break;
            case 22:
                /* 22: epilogue => nonEmptyEpilogue */
                var ep = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setEpilogue(ep); } 
                break;
            case 23:
                /* 23: nonEmptyEpilogue => nonEmptyEpilogue <ANY_CODE> */
                var c = jjsematicS[jjsp - 1];
                if(jjenableBlock){ nodeExtend(jjtop, c, jjtop.val + c.val); } 
                break;
            case 25:
                /* 25: associativeDir => "%left" */
                if(jjenableBlock){ assoc = Assoc.LEFT; } 
                break;
            case 26:
                /* 26: associativeDir => "%right" */
                if(jjenableBlock){ assoc = Assoc.RIGHT; } 
                break;
            case 27:
                /* 27: associativeDir => "%nonassoc" */
                if(jjenableBlock){ assoc = Assoc.NON; } 
                break;
            case 30:
                /* 30: assocToken => tokenRef */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.defineTokenPrec(t, assoc, t.ext); } 
                break;
            case 31:
                /* 31: assocToken => <NAME> */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.defineTokenPrec(t, assoc, TokenRefType.NAME); } 
                break;
            case 32:
                /* 32: optionBody => optionBody <NAME> "=" <STRING> */
                var name = jjsematicS[jjsp - 3];
                var val = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.setOpt(name, val); } 
                break;
            case 35:
                /* 35: states_ => */
                if(jjenableBlock){ gb.lexBuilder.selectState('DEFAULT'); } 
                break;
            case 36:
                /* 36: states => <NAME> */
                var s = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.selectState(s.val); } 
                break;
            case 37:
                /* 37: states => states "," <NAME> */
                var s = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.selectState(s.val); } 
                break;
            case 40:
                /* 40: @2 => */
                var v = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.prepareVar(v); } 
                break;
            case 41:
                /* 41: lexBodyItem => <NAME> @2 "=" "<" regexp ">" */
                var v = jjsematicS[jjsp - 6];
                if(jjenableBlock){ gb.lexBuilder.endVar(); } 
                break;
            case 42:
                /* 42: lexBodyItem => newState "<" regexp ">" lexAction_ */
                if(jjenableBlock){ gb.lexBuilder.end(lexact, least, '(untitled)'); } 
                break;
            case 43:
                /* 43: lexBodyItem => newState "<" <NAME> ":" regexp ">" lexAction_ */
                var tn = jjsematicS[jjsp - 5];
                if(jjenableBlock){ 
        let tdef = gb.defToken(tn, gb.lexBuilder.getPossibleAlias());
        lexact.returnToken(tdef);
        gb.lexBuilder.end(lexact, least, tn.val);
    } 
                break;
            case 44:
                /* 44: newState => */
                if(jjenableBlock){ gb.lexBuilder.newState(); } 
                break;
            case 46:
                /* 46: lexAction_ => */
                if(jjenableBlock){ lexact = new LexAction(); } 
                break;
            case 47:
                /* 47: @3 => */
                if(jjenableBlock){ lexact = new LexAction(); } 
                break;
            case 49:
                /* 49: @4 => */
                if(jjenableBlock){ lexact = new LexAction(); } 
                break;
            case 53:
                /* 53: lexActionItem => "+" <NAME> */
                var vn = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addPushStateAction(lexact, vn); lexact.raw('; '); } 
                break;
            case 54:
                /* 54: lexActionItem => "-" */
                if(jjenableBlock){ lexact.popState(); lexact.raw('; '); } 
                break;
            case 55:
                /* 55: lexActionItem => "=>" <NAME> */
                var sn = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addSwitchToStateAction(lexact, sn); lexact.raw('; '); } 
                break;
            case 56:
                /* 56: lexActionItem => "=" <STRING> */
                var s = jjsematicS[jjsp - 1];
                if(jjenableBlock){ lexact.setImg(s.val); lexact.raw('; '); } 
                break;
            case 58:
                /* 58: regexp => innerRegexp */
                if(jjenableBlock){ least = false; } 
                break;
            case 59:
                /* 59: regexp => "%least" innerRegexp */
                if(jjenableBlock){ least = true; } 
                break;
            case 60:
                /* 60: @5 => */
                if(jjenableBlock){ gb.lexBuilder.enterUnion(); } 
                break;
            case 61:
                /* 61: innerRegexp => @5 union */
                if(jjenableBlock){ gb.lexBuilder.leaveUnion(); } 
                break;
            case 62:
                /* 62: union => union "|" simpleRE */
                if(jjenableBlock){ gb.lexBuilder.endUnionItem(); } 
                break;
            case 63:
                /* 63: union => simpleRE */
                if(jjenableBlock){ gb.lexBuilder.endUnionItem(); } 
                break;
            case 66:
                /* 66: @6 => */
                if(jjenableBlock){ gb.lexBuilder.enterSimple(); } 
                break;
            case 67:
                /* 67: basicRE => @6 primitiveRE rePostfix */
                var suffix = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.simplePostfix(suffix.val as (''|'?'|'+'|'*')); } 
                break;
            case 68:
                /* 68: rePostfix => "+" */
                if(jjenableBlock){ jjtop = newNode('+'); } 
                break;
            case 69:
                /* 69: rePostfix => "?" */
                if(jjenableBlock){ jjtop = newNode('?'); } 
                break;
            case 70:
                /* 70: rePostfix => "*" */
                if(jjenableBlock){ jjtop = newNode('*'); } 
                break;
            case 71:
                /* 71: rePostfix => */
                if(jjenableBlock){ jjtop = newNode(''); } 
                break;
            case 74:
                /* 74: primitiveRE => "<" <NAME> ">" */
                var n = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.lexBuilder.addVar(n); } 
                break;
            case 75:
                /* 75: primitiveRE => "%import" "(" <STRING> ")" */
                var i = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.lexBuilder.importVar(i); } 
                break;
            case 76:
                /* 76: primitiveRE => <STRING> */
                var s = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.addString(s.val); } 
                break;
            case 77:
                /* 77: inverse_ => "^" */
                if(jjenableBlock){ gb.lexBuilder.beginSet(true); } 
                break;
            case 78:
                /* 78: inverse_ => */
                if(jjenableBlock){ gb.lexBuilder.beginSet(false); } 
                break;
            case 83:
                /* 83: setREItem => <STRING> */
                var s = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.addSetItem(s, s); } 
                break;
            case 84:
                /* 84: setREItem => <STRING> "-" <STRING> */
                var from = jjsematicS[jjsp - 3];
                var to = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.lexBuilder.addSetItem(from, to); } 
                break;
            case 88:
                /* 88: @7 => */
                var n = jjsematicS[jjsp - 1];
                if(jjenableBlock){ ruleLhs = n; } 
                break;
            case 94:
                /* 94: @8 => */
                if(jjenableBlock){ gb.prepareRule(ruleLhs); } 
                break;
            case 95:
                /* 95: rule => @8 ruleHead ruleBody ruleTrailer */
                if(jjenableBlock){ gb.commitRule(); } 
                break;
            case 98:
                /* 98: varUseList => varUseList "," <NAME> */
                var vn = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addRuleUseVar(vn); } 
                break;
            case 99:
                /* 99: varUseList => <NAME> */
                var vn = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addRuleUseVar(vn); } 
                break;
            case 104:
                /* 104: itemName => <NAME> "=" */
                var itn = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.addRuleSematicVar(itn); } 
                break;
            case 106:
                /* 106: ruleItem => <NAME> */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addRuleItem(t, TokenRefType.NAME); } 
                break;
            case 107:
                /* 107: @9 => */
                var vn = jjsematicS[jjsp - 2];
                if(jjenableBlock){ gb.addRuleSematicVar(vn); } 
                break;
            case 108:
                /* 108: ruleItem => <NAME> "=" @9 <NAME> */
                var vn = jjsematicS[jjsp - 4];
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addRuleItem(t, TokenRefType.NAME); } 
                break;
            case 109:
                /* 109: ruleItem => itemName tokenRef */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addRuleItem(t, t.ext); } 
                break;
            case 110:
                /* 110: ruleItem => itemName lexAction */
                if(jjenableBlock){ gb.addAction(lexact); } 
                break;
            case 111:
                /* 111: tokenRef => "<" <NAME> ">" */
                var t = jjsematicS[jjsp - 2];
                if(jjenableBlock){ jjtop = t; jjtop.ext = TokenRefType.TOKEN; } 
                break;
            case 112:
                /* 112: tokenRef => <STRING> */
                if(jjenableBlock){ jjtop.ext = TokenRefType.STRING; } 
                break;
            case 115:
                /* 115: ruleTrailer => rulePrec lexAction */
                if(jjenableBlock){ gb.addAction(lexact); } 
                break;
            case 116:
                /* 116: rulePrec => "%prec" <NAME> */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.defineRulePr(t, TokenRefType.NAME); } 
                break;
            case 117:
                /* 117: rulePrec => "%prec" tokenRef */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.defineRulePr(t, t.ext); } 
                break;
            case 118:
                /* 118: @10 => */
                var open = jjsematicS[jjsp - 1];
                jjlexState.push(2); 
                break;
            case 119:
                /* 119: @11 => */
                var open = jjsematicS[jjsp - 4];
                var bl = jjsematicS[jjsp - 2];
                var close = jjsematicS[jjsp - 1];
                jjlexState.pop(); 
                break;
            case 120:
                /* 120: block => "{" @10 innerBlock "}" @11 */
                var open = jjsematicS[jjsp - 5];
                var bl = jjsematicS[jjsp - 3];
                var close = jjsematicS[jjsp - 2];
                if(jjenableBlock){ jjtop = nodeBetween(open, close, bl.val); } 
                break;
            case 121:
                /* 121: innerBlock => innerBlock innerBlockItem */
                var b = jjsematicS[jjsp - 1];
                if(jjenableBlock){ jjtop.val += b.val; } 
                break;
            case 122:
                /* 122: innerBlock => */
                if(jjenableBlock){ jjtop = newNode(''); } 
                break;
            case 124:
                /* 124: @12 => */
                jjlexState.push(2); 
                break;
            case 125:
                /* 125: @13 => */
                var b = jjsematicS[jjsp - 2];
                jjlexState.pop(); 
                break;
            case 126:
                /* 126: innerBlockItem => "{" @12 innerBlock "}" @13 */
                var b = jjsematicS[jjsp - 3];
                if(jjenableBlock){ jjtop = newNode(''); jjtop.val = '{' + b.val + '}'; } 
                break;
            case 127:
                /* 127: @14 => */
                var open = jjsematicS[jjsp - 1];
                jjlexState.push(3); 
                break;
            case 128:
                /* 128: @15 => */
                var open = jjsematicS[jjsp - 2];
                if(jjenableBlock){ lexact.beginBlock(open, always); } 
                break;
            case 129:
                /* 129: @16 => */
                var open = jjsematicS[jjsp - 5];
                var t = jjsematicS[jjsp - 3];
                var close = jjsematicS[jjsp - 1];
                jjlexState.pop(); 
                break;
            case 130:
                /* 130: actionBlock => always "{" @14 @15 innerActionBlock "}" @16 */
                var open = jjsematicS[jjsp - 6];
                var t = jjsematicS[jjsp - 4];
                var close = jjsematicS[jjsp - 2];
                if(jjenableBlock){ lexact.endBlock(close); } 
                break;
            case 131:
                /* 131: always => "%always" */
                if(jjenableBlock){ always = true; } 
                break;
            case 132:
                /* 132: always => */
                if(jjenableBlock){ always = false; } 
                break;
            case 135:
                /* 135: innerActionBlockItem => codeList */
                var c = jjsematicS[jjsp - 1];
                if(jjenableBlock){ lexact.raw(c.val); } 
                break;
            case 136:
                /* 136: innerActionBlockItem => "$$" */
                if(jjenableBlock){ lexact.lhs(); } 
                break;
            case 137:
                /* 137: innerActionBlockItem => "$token" */
                if(jjenableBlock){ lexact.tokenObj(); } 
                break;
            case 138:
                /* 138: innerActionBlockItem => "$matched" */
                if(jjenableBlock){ lexact.matched(); } 
                break;
            case 139:
                /* 139: innerActionBlockItem => <EMIT_TOKEN> */
                var t = jjsematicS[jjsp - 1];
                if(jjenableBlock){ gb.addEmitTokenAction(lexact, t); } 
                break;
            case 140:
                /* 140: @17 => */
                jjlexState.push(3); 
                break;
            case 141:
                /* 141: @18 => */
                if(jjenableBlock){ lexact.raw('{'); } 
                break;
            case 142:
                /* 142: @19 => */
                jjlexState.pop(); 
                break;
            case 143:
                /* 143: innerActionBlockItem => "{" @17 @18 innerActionBlock "}" @19 */
                if(jjenableBlock){ lexact.raw('}'); } 
                break;
            case 144:
                /* 144: codeList => codeList <ANY_CODE> */
                var c = jjsematicS[jjsp - 1];
                if(jjenableBlock){ nodeExtend(jjtop, c, jjtop.val + c.val); } 
                break;
        }
        jjlrState.length -= jjruleLen[jjrulenum];
        var jjcstate = jjlrState[jjlrState.length - 1];
        jjlrState.push(jjpgoto[jjdisgoto[jjcstate] + jjnt]);

        jjsematicS.length -= jjruleLen[jjrulenum];
        jjsematicS.push(jjtop);
    }
    function jjacceptToken(tk: Token){
        // look up action table
        var shifted = false;
        tk !== null && jjtokenQueue.push(tk);
        while(!jjstop && jjtokenQueue.length > 0){
            var t = jjtokenQueue[0];
            var cstate = jjlrState[jjlrState.length - 1];
            var ind = jjdisact[cstate] + t.id;
            var act = 0;
            if(ind < 0 || ind >= jjpact.length || jjcheckact[ind] !== cstate){
                act = -jjdefred[cstate] - 1;
            }
            else {
                act = jjpact[ind];
            }
            if(act === jjactERR){
                // explicit error
                jjsyntaxError(t);
                jjtokenQueue.shift();
            }
            else if(act > 0){
                // shift
                if(t.id === 0){
                    // end of file
                    jjstop = true;
                    jjemit('accept');
                    jjtokenQueue.shift();
                }
                else {
                    jjlrState.push(act - 1);
                    jjsematicS.push(jjsematicVal);
                    jjsematicVal = null;
                    jjtryReduce();
                    // token consumed
                    jjtokenQueue.shift();
                }
            }
            else if(act < 0){
                jjdoReduction(-act - 1);
                jjtryReduce();
            }
            else {
                // error
                jjsyntaxError(t);
                // force consume
                jjtokenQueue.shift();
            }
        }
    }
    function jjtryReduce(){
        var cstate = jjlrState[jjlrState.length - 1];
        var act;
        while(jjdisact[cstate] === -jjtokenCount && (act = jjdefred[cstate]) !== -1){
            jjdoReduction(act);
            cstate = jjlrState[jjlrState.length - 1];
        }
    }
    function jjsyntaxError(t: Token){
        jjemit("syntaxerror", t, jjlrState[jjlrState.length - 1]);
    }
}


export namespace highlight {
    export enum TokenType {
        EOF = 1,
        NONE,
        ERROR,
        STRING,
        NAME,
        COMMENT,
        DIRECTIVE,
        PUNCTUATION,
        CODE,
        TOKEN_IN_CODE
    };
    function getTokenType(tid: TokenKind): TokenType{
        switch(tid){
            case TokenKind.EOF: return TokenType.EOF;
            case TokenKind.ERROR: return TokenType.ERROR;
            case TokenKind.COMMENT: return TokenType.COMMENT;
            case TokenKind.NAME: return TokenType.NAME;
            case TokenKind.STRING: return TokenType.STRING;
            case TokenKind.OPT_DIR:
            case TokenKind.LEX_DIR:
            case TokenKind.TOKEN_DIR:
            case TokenKind.LEFT_DIR:
            case TokenKind.RIGHT_DIR:
            case TokenKind.NONASSOC_DIR:
            case TokenKind.USE_DIR:
            case TokenKind.HEADER_DIR:
            case TokenKind.EXTRA_ARG_DIR:
            case TokenKind.EMPTY:
            case TokenKind.TYPE_DIR:
            case TokenKind.PREC_DIR:
            case TokenKind.INIT_DIR:
            case TokenKind.OUTPUT_DIR:
            case TokenKind.IMPORT_DIR:
            case TokenKind.TOKEN_HOOK_DIR:
            case TokenKind.LEAST_DIR:
            case TokenKind.ALWAYS_DIR:
            case TokenKind.SEPERATOR:
            case TokenKind.TOUCH_DIR: return TokenType.DIRECTIVE;
            case TokenKind.OPEN_BLOCK:
            case TokenKind.CLOSE_BLOCK:
            case TokenKind.GT:
            case TokenKind.LT:
            case TokenKind.BRA:
            case TokenKind.KET:
            case TokenKind.EQU:
            case TokenKind.CBRA:
            case TokenKind.CKET:
            case TokenKind.QUESTION:
            case TokenKind.STAR:
            case TokenKind.PLUS:
            case TokenKind.DASH:
            case TokenKind.COLON:
            case TokenKind.ARROW:
            case TokenKind.EOL:
            case TokenKind.OR:
            case TokenKind.WEDGE:
            case TokenKind.COMMA: return TokenType.PUNCTUATION;
            case TokenKind.LHS_REF:
            case TokenKind.TOKEN_REF:
            case TokenKind.MATCHED:
            case TokenKind.EMIT_TOKEN: return TokenType.TOKEN_IN_CODE;
            case TokenKind.WHITESPACE:
            case TokenKind.ANY_CODE:
            default: return TokenType.NONE;
        }
    }
    export interface HighlightContext {
        load(input: ParserInput | string);
        nextToken(): TokenType;
        loadState(state: ParserState);
        getState(): ParserState;
    };
    export function createHighlightContext(){
        var parser: Parser = createParser();
        var err = false;
        parser.disableBlocks();
        parser.on('syntaxerror', () => err = true);
        parser.init(null, null);
        return {
            load: input => parser.load(input),
            nextToken,
            loadState: s => parser.loadParserState(s),
            getState: () => parser.getParserState()
        };
        function nextToken(): TokenType{
            err = false;
            var t = parser.nextToken();
            if(t === null){
                return null;
            }
            else if(t.id !== TokenKind.EOF && err){
                return TokenType.ERROR;
            }
            else {
                return getTokenType(t.id);
            }
        }
    }
    export function highlightString(s: string, getClass: (t: TokenType) => string): string{
        var escapes = {
            '>': '&gt;',
            '<': '&lt;',
            ' ': '&nbsp;',
            '&': '&amp;',
            '\n': '<br />',
            '\t': '&nbsp;&nbsp;&nbsp;&nbsp;'
        };
        function escapeHTML(s: string): string{
            var ret = '';
            for(var i = 0; i < s.length; i++){
                var c = s.charAt(i);
                ret += escapes[c] || c;
            }
            return ret;
        }
        var ret = '';
        var tokenBase: number = 0;
        var hc = createHighlightContext();
        var i = 0;
        hc.load({
            current: () => i < s.length ? s.charCodeAt(i) : null,
            next: () => i++,
            isEof: () => i >= s.length,
            backup: s => i -= s.length
        });
        var tt: TokenType;
        while((tt = hc.nextToken()) !== TokenType.EOF){
            var cl = getClass(tt);
            if(cl !== null){
                ret += `<span class="${cl}">${escapeHTML(s.substr(tokenBase, i - tokenBase))}</span>`;
            }
            else {
                ret += escapeHTML(s.substr(tokenBase, i - tokenBase));
            }
            tokenBase = i;
        }
        return ret;
    }
};
function charPosition(c: string, line: number, column: number): Position{
    return {
        startLine: line,
        startColumn: column,
        endLine: line,
        endColumn: c.charCodeAt(0) > 0xff ? column + 1 : column
    }
}
export function yyparse(ctx: Context, source: string): File{
    let parser = createParser();
    let err = false;
    parser.on('syntaxerror', (token, state) => {
        if(token.id === TokenKind.ERROR){
            ctx.requireLines((ctx, lines) => {
                let msg2 = 'unexpected illegal token ' + markPosition(token, lines) + '\n';
                ctx.err(new JsccError(msg2, 'Lexical error'));
            });
        }
        else {
            var msg = `unexpected token ${token.toString()}, expecting one of the following tokens:\n`;
            for(var tk of getExpectedTokens(state)){
                msg += `    ${tokenToString(tk)} ...\n`;
            }
            ctx.requireLines((ctx, lines) => {
                let msg2 = markPosition(token, lines) + '\n' + msg;
                ctx.err(new JsccError(msg2, 'Syntax error'));
            });
        }
        parser.halt();
        err = true;
    });
    let gb = createFileBuilder(ctx);
    parser.init(ctx, gb);

    ctx.beginTime('parse grammar file');
    parser.parse(source);
    ctx.endTime();

    var eol = parser.getLineTerminator();
    var el = '\n';
    if(eol !== LineTerm.NONE && eol !== LineTerm.AUTO){
        el = eol === LineTerm.CR ? '\r' : 
            eol === LineTerm.LF ? '\n' :
            eol === LineTerm.CRLF ? '\r\n' : null;
        gb.setLineTerminator(el);
    }
    
    if(err){
        var ret = new File();
        ret.eol = el;
        return ret;
    }
    else {
        return gb.build();
    }
}