1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +00:00

Added #define to KickC lexer. #169

This commit is contained in:
jespergravgaard 2020-04-05 09:32:10 +02:00
parent ea49dc910a
commit 375578e7df
9 changed files with 1799 additions and 969 deletions

View File

@ -23,6 +23,11 @@ import java.util.Map;
public class CParser {
/** The hidden lexer channel containing whitespace. */
public static final int CHANNEL_WHITESPACE = 1;
/** The hidden lexer channel containing comments. */
public static final int CHANNEL_COMMENTS = 2;
/** The Program. */
private Program program;

View File

@ -118,11 +118,14 @@ SIMPLETYPE: 'byte' | 'word' | 'dword' | 'bool' | 'char' | 'short' | 'int' | 'lon
BOOLEAN : 'true' | 'false';
KICKASM_BODY: '{{' .*? '}}';
// Strings and chars - with special handling of imports
STRING : '"' ('\\"' | ~'"')* '"' [z]?([ps][mu]?)?[z]? { if(importEnter) { importEnter=false; cParser.loadCFile(getText()); } } ;
CHAR : '\'' ('\\'['"rfn] | ~'\'' ) '\'';
// Macros
DEFINE: '#define' ;
DEFINE_CONTINUE: '\\\n' ;
// Numbers
NUMBER : NUMFLOAT | NUMINT ;
NUMFLOAT : BINFLOAT | DECFLOAT | HEXFLOAT;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -92,55 +92,57 @@ BOOLEAN=91
KICKASM_BODY=92
STRING=93
CHAR=94
NUMBER=95
NUMFLOAT=96
BINFLOAT=97
DECFLOAT=98
HEXFLOAT=99
NUMINT=100
BININTEGER=101
DECINTEGER=102
HEXINTEGER=103
NAME=104
WS=105
COMMENT_LINE=106
COMMENT_BLOCK=107
ASM_BYTE=108
ASM_MNEMONIC=109
ASM_IMM=110
ASM_COLON=111
ASM_COMMA=112
ASM_PAR_BEGIN=113
ASM_PAR_END=114
ASM_BRACKET_BEGIN=115
ASM_BRACKET_END=116
ASM_DOT=117
ASM_SHIFT_LEFT=118
ASM_SHIFT_RIGHT=119
ASM_PLUS=120
ASM_MINUS=121
ASM_LESS_THAN=122
ASM_GREATER_THAN=123
ASM_MULTIPLY=124
ASM_DIVIDE=125
ASM_CURLY_BEGIN=126
ASM_CURLY_END=127
ASM_NUMBER=128
ASM_NUMFLOAT=129
ASM_BINFLOAT=130
ASM_DECFLOAT=131
ASM_HEXFLOAT=132
ASM_NUMINT=133
ASM_BININTEGER=134
ASM_DECINTEGER=135
ASM_HEXINTEGER=136
ASM_CHAR=137
ASM_MULTI_REL=138
ASM_MULTI_NAME=139
ASM_NAME=140
ASM_WS=141
ASM_COMMENT_LINE=142
ASM_COMMENT_BLOCK=143
DEFINE=95
DEFINE_CONTINUE=96
NUMBER=97
NUMFLOAT=98
BINFLOAT=99
DECFLOAT=100
HEXFLOAT=101
NUMINT=102
BININTEGER=103
DECINTEGER=104
HEXINTEGER=105
NAME=106
WS=107
COMMENT_LINE=108
COMMENT_BLOCK=109
ASM_BYTE=110
ASM_MNEMONIC=111
ASM_IMM=112
ASM_COLON=113
ASM_COMMA=114
ASM_PAR_BEGIN=115
ASM_PAR_END=116
ASM_BRACKET_BEGIN=117
ASM_BRACKET_END=118
ASM_DOT=119
ASM_SHIFT_LEFT=120
ASM_SHIFT_RIGHT=121
ASM_PLUS=122
ASM_MINUS=123
ASM_LESS_THAN=124
ASM_GREATER_THAN=125
ASM_MULTIPLY=126
ASM_DIVIDE=127
ASM_CURLY_BEGIN=128
ASM_CURLY_END=129
ASM_NUMBER=130
ASM_NUMFLOAT=131
ASM_BINFLOAT=132
ASM_DECFLOAT=133
ASM_HEXFLOAT=134
ASM_NUMINT=135
ASM_BININTEGER=136
ASM_DECINTEGER=137
ASM_HEXINTEGER=138
ASM_CHAR=139
ASM_MULTI_REL=140
ASM_MULTI_NAME=141
ASM_NAME=142
ASM_WS=143
ASM_COMMENT_LINE=144
ASM_COMMENT_BLOCK=145
';'=8
'..'=11
'?'=12
@ -209,5 +211,7 @@ ASM_COMMENT_BLOCK=143
'bytes'=86
'cycles'=87
'!'=88
'.byte'=108
'#'=110
'#define'=95
'\\\n'=96
'.byte'=110
'#'=112

File diff suppressed because one or more lines are too long

View File

@ -34,17 +34,18 @@ public class KickCParser extends Parser {
ASM=75, DEFAULT=76, CASE=77, STRUCT=78, ENUM=79, SIZEOF=80, TYPEID=81,
KICKASM=82, RESOURCE=83, USES=84, CLOBBERS=85, BYTES=86, CYCLES=87, LOGIC_NOT=88,
SIGNEDNESS=89, SIMPLETYPE=90, BOOLEAN=91, KICKASM_BODY=92, STRING=93,
CHAR=94, NUMBER=95, NUMFLOAT=96, BINFLOAT=97, DECFLOAT=98, HEXFLOAT=99,
NUMINT=100, BININTEGER=101, DECINTEGER=102, HEXINTEGER=103, NAME=104,
WS=105, COMMENT_LINE=106, COMMENT_BLOCK=107, ASM_BYTE=108, ASM_MNEMONIC=109,
ASM_IMM=110, ASM_COLON=111, ASM_COMMA=112, ASM_PAR_BEGIN=113, ASM_PAR_END=114,
ASM_BRACKET_BEGIN=115, ASM_BRACKET_END=116, ASM_DOT=117, ASM_SHIFT_LEFT=118,
ASM_SHIFT_RIGHT=119, ASM_PLUS=120, ASM_MINUS=121, ASM_LESS_THAN=122, ASM_GREATER_THAN=123,
ASM_MULTIPLY=124, ASM_DIVIDE=125, ASM_CURLY_BEGIN=126, ASM_CURLY_END=127,
ASM_NUMBER=128, ASM_NUMFLOAT=129, ASM_BINFLOAT=130, ASM_DECFLOAT=131,
ASM_HEXFLOAT=132, ASM_NUMINT=133, ASM_BININTEGER=134, ASM_DECINTEGER=135,
ASM_HEXINTEGER=136, ASM_CHAR=137, ASM_MULTI_REL=138, ASM_MULTI_NAME=139,
ASM_NAME=140, ASM_WS=141, ASM_COMMENT_LINE=142, ASM_COMMENT_BLOCK=143;
CHAR=94, DEFINE=95, DEFINE_CONTINUE=96, NUMBER=97, NUMFLOAT=98, BINFLOAT=99,
DECFLOAT=100, HEXFLOAT=101, NUMINT=102, BININTEGER=103, DECINTEGER=104,
HEXINTEGER=105, NAME=106, WS=107, COMMENT_LINE=108, COMMENT_BLOCK=109,
ASM_BYTE=110, ASM_MNEMONIC=111, ASM_IMM=112, ASM_COLON=113, ASM_COMMA=114,
ASM_PAR_BEGIN=115, ASM_PAR_END=116, ASM_BRACKET_BEGIN=117, ASM_BRACKET_END=118,
ASM_DOT=119, ASM_SHIFT_LEFT=120, ASM_SHIFT_RIGHT=121, ASM_PLUS=122, ASM_MINUS=123,
ASM_LESS_THAN=124, ASM_GREATER_THAN=125, ASM_MULTIPLY=126, ASM_DIVIDE=127,
ASM_CURLY_BEGIN=128, ASM_CURLY_END=129, ASM_NUMBER=130, ASM_NUMFLOAT=131,
ASM_BINFLOAT=132, ASM_DECFLOAT=133, ASM_HEXFLOAT=134, ASM_NUMINT=135,
ASM_BININTEGER=136, ASM_DECINTEGER=137, ASM_HEXINTEGER=138, ASM_CHAR=139,
ASM_MULTI_REL=140, ASM_MULTI_NAME=141, ASM_NAME=142, ASM_WS=143, ASM_COMMENT_LINE=144,
ASM_COMMENT_BLOCK=145;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3,
RULE_importDecl = 4, RULE_decl = 5, RULE_declVariables = 6, RULE_declVariableList = 7,
@ -88,8 +89,8 @@ public class KickCParser extends Parser {
"'break'", "'continue'", "'asm'", "'default'", "'case'", "'struct'",
"'enum'", "'sizeof'", "'typeid'", "'kickasm'", "'resource'", "'uses'",
"'clobbers'", "'bytes'", "'cycles'", "'!'", null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, "'.byte'", null, "'#'"
null, "'#define'", "'\\\n'", null, null, null, null, null, null, null,
null, null, null, null, null, null, "'.byte'", null, "'#'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@ -109,15 +110,16 @@ public class KickCParser extends Parser {
"CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID",
"KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", "LOGIC_NOT",
"SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "STRING", "CHAR",
"NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"DECINTEGER", "HEXINTEGER", "NAME", "WS", "COMMENT_LINE", "COMMENT_BLOCK",
"ASM_BYTE", "ASM_MNEMONIC", "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN",
"ASM_PAR_END", "ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT",
"ASM_SHIFT_RIGHT", "ASM_PLUS", "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN",
"ASM_MULTIPLY", "ASM_DIVIDE", "ASM_CURLY_BEGIN", "ASM_CURLY_END", "ASM_NUMBER",
"ASM_NUMFLOAT", "ASM_BINFLOAT", "ASM_DECFLOAT", "ASM_HEXFLOAT", "ASM_NUMINT",
"ASM_BININTEGER", "ASM_DECINTEGER", "ASM_HEXINTEGER", "ASM_CHAR", "ASM_MULTI_REL",
"ASM_MULTI_NAME", "ASM_NAME", "ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK"
"DEFINE", "DEFINE_CONTINUE", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT",
"HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME",
"WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE", "ASM_MNEMONIC", "ASM_IMM",
"ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN", "ASM_PAR_END", "ASM_BRACKET_BEGIN",
"ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT", "ASM_SHIFT_RIGHT", "ASM_PLUS",
"ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN", "ASM_MULTIPLY", "ASM_DIVIDE",
"ASM_CURLY_BEGIN", "ASM_CURLY_END", "ASM_NUMBER", "ASM_NUMFLOAT", "ASM_BINFLOAT",
"ASM_DECFLOAT", "ASM_HEXFLOAT", "ASM_NUMINT", "ASM_BININTEGER", "ASM_DECINTEGER",
"ASM_HEXINTEGER", "ASM_CHAR", "ASM_MULTI_REL", "ASM_MULTI_NAME", "ASM_NAME",
"ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@ -6175,7 +6177,7 @@ public class KickCParser extends Parser {
setState(784);
_errHandler.sync(this);
_la = _input.LA(1);
while (((((_la - 108)) & ~0x3f) == 0 && ((1L << (_la - 108)) & ((1L << (ASM_BYTE - 108)) | (1L << (ASM_MNEMONIC - 108)) | (1L << (ASM_MULTI_NAME - 108)) | (1L << (ASM_NAME - 108)))) != 0)) {
while (((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (ASM_BYTE - 110)) | (1L << (ASM_MNEMONIC - 110)) | (1L << (ASM_MULTI_NAME - 110)) | (1L << (ASM_NAME - 110)))) != 0)) {
{
{
setState(781);
@ -6936,7 +6938,7 @@ public class KickCParser extends Parser {
_prevctx = _localctx;
setState(841);
_la = _input.LA(1);
if ( !(((((_la - 120)) & ~0x3f) == 0 && ((1L << (_la - 120)) & ((1L << (ASM_PLUS - 120)) | (1L << (ASM_MINUS - 120)) | (1L << (ASM_LESS_THAN - 120)) | (1L << (ASM_GREATER_THAN - 120)))) != 0)) ) {
if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (ASM_PLUS - 122)) | (1L << (ASM_MINUS - 122)) | (1L << (ASM_LESS_THAN - 122)) | (1L << (ASM_GREATER_THAN - 122)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -7218,7 +7220,7 @@ public class KickCParser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0091\u0368\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0093\u0368\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -7283,283 +7285,284 @@ public class KickCParser extends Parser {
"/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\7/\u0363\n/\f/\16/\u0366\13/\3/\2\t\20"+
"\34\36*DF\\\60\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64"+
"\668:<>@BDFHJLNPRTVXZ\\\2\r\3\2\26\27\5\2\21\22\30\31ZZ\4\2 ##\3\2\34"+
"\35\3\2\23\25\3\2\21\22\3\2\36#\3\2z}\3\2xy\3\2~\177\3\2z{\2\u03e4\2^"+
"\3\2\2\2\4a\3\2\2\2\6g\3\2\2\2\bl\3\2\2\2\nn\3\2\2\2\f\u0080\3\2\2\2\16"+
"\u0082\3\2\2\2\20\u0085\3\2\2\2\22\u009c\3\2\2\2\24\u00c1\3\2\2\2\26\u00c6"+
"\3\2\2\2\30\u00d0\3\2\2\2\32\u00d7\3\2\2\2\34\u00dd\3\2\2\2\36\u00fc\3"+
"\2\2\2 \u010c\3\2\2\2\"\u010f\3\2\2\2$\u011b\3\2\2\2&\u011e\3\2\2\2(\u0121"+
"\3\2\2\2*\u0129\3\2\2\2,\u0134\3\2\2\2.\u0139\3\2\2\2\60\u014c\3\2\2\2"+
"\62\u015e\3\2\2\2\64\u01aa\3\2\2\2\66\u01d6\3\2\2\28\u01d9\3\2\2\2:\u0231"+
"\3\2\2\2<\u0234\3\2\2\2>\u023f\3\2\2\2@\u025b\3\2\2\2B\u0261\3\2\2\2D"+
"\u0263\3\2\2\2F\u02a4\3\2\2\2H\u02e5\3\2\2\2J\u02ed\3\2\2\2L\u02f3\3\2"+
"\2\2N\u030d\3\2\2\2P\u0312\3\2\2\2R\u0318\3\2\2\2T\u031e\3\2\2\2V\u0320"+
"\3\2\2\2X\u0324\3\2\2\2Z\u0344\3\2\2\2\\\u0354\3\2\2\2^_\5\6\4\2_`\7\2"+
"\2\3`\3\3\2\2\2ab\5P)\2bc\7\2\2\3c\5\3\2\2\2df\5\b\5\2ed\3\2\2\2fi\3\2"+
"\2\2ge\3\2\2\2gh\3\2\2\2h\7\3\2\2\2ig\3\2\2\2jm\5\f\7\2km\5\n\6\2lj\3"+
"\2\2\2lk\3\2\2\2m\t\3\2\2\2no\7(\2\2op\7_\2\2p\13\3\2\2\2qr\5\16\b\2r"+
"s\7\n\2\2s\u0081\3\2\2\2tu\5\"\22\2uv\7\n\2\2v\u0081\3\2\2\2wx\5(\25\2"+
"xy\7\n\2\2y\u0081\3\2\2\2z\u0081\5.\30\2{\u0081\5J&\2|\u0081\5\64\33\2"+
"}~\5\22\n\2~\177\7\n\2\2\177\u0081\3\2\2\2\u0080q\3\2\2\2\u0080t\3\2\2"+
"\2\u0080w\3\2\2\2\u0080z\3\2\2\2\u0080{\3\2\2\2\u0080|\3\2\2\2\u0080}"+
"\3\2\2\2\u0081\r\3\2\2\2\u0082\u0083\5\26\f\2\u0083\u0084\5\20\t\2\u0084"+
"\17\3\2\2\2\u0085\u0089\b\t\1\2\u0086\u0088\5\30\r\2\u0087\u0086\3\2\2"+
"\2\u0088\u008b\3\2\2\2\u0089\u0087\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u008c"+
"\3\2\2\2\u008b\u0089\3\2\2\2\u008c\u008d\5\24\13\2\u008d\u0099\3\2\2\2"+
"\u008e\u008f\f\3\2\2\u008f\u0093\7\f\2\2\u0090\u0092\5\30\r\2\u0091\u0090"+
"\3\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2\2\2\u0094"+
"\u0096\3\2\2\2\u0095\u0093\3\2\2\2\u0096\u0098\5\24\13\2\u0097\u008e\3"+
"\2\2\2\u0098\u009b\3\2\2\2\u0099\u0097\3\2\2\2\u0099\u009a\3\2\2\2\u009a"+
"\21\3\2\2\2\u009b\u0099\3\2\2\2\u009c\u009d\7)\2\2\u009d\u00a1\5\26\f"+
"\2\u009e\u00a0\5\30\r\2\u009f\u009e\3\2\2\2\u00a0\u00a3\3\2\2\2\u00a1"+
"\u009f\3\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\u00a4\3\2\2\2\u00a3\u00a1\3\2"+
"\2\2\u00a4\u00a8\7j\2\2\u00a5\u00a7\5\32\16\2\u00a6\u00a5\3\2\2\2\u00a7"+
"\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00ab\3\2"+
"\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00ac\b\n\1\2\u00ac\23\3\2\2\2\u00ad\u00b1"+
"\7j\2\2\u00ae\u00b0\5\32\16\2\u00af\u00ae\3\2\2\2\u00b0\u00b3\3\2\2\2"+
"\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b6\3\2\2\2\u00b3\u00b1"+
"\3\2\2\2\u00b4\u00b5\7&\2\2\u00b5\u00b7\5F$\2\u00b6\u00b4\3\2\2\2\u00b6"+
"\u00b7\3\2\2\2\u00b7\u00c2\3\2\2\2\u00b8\u00bc\7j\2\2\u00b9\u00bb\5\32"+
"\16\2\u00ba\u00b9\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bc"+
"\u00bd\3\2\2\2\u00bd\u00bf\3\2\2\2\u00be\u00bc\3\2\2\2\u00bf\u00c0\7&"+
"\2\2\u00c0\u00c2\5J&\2\u00c1\u00ad\3\2\2\2\u00c1\u00b8\3\2\2\2\u00c2\25"+
"\3\2\2\2\u00c3\u00c5\5\66\34\2\u00c4\u00c3\3\2\2\2\u00c5\u00c8\3\2\2\2"+
"\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00c9\3\2\2\2\u00c8\u00c6"+
"\3\2\2\2\u00c9\u00cd\5\36\20\2\u00ca\u00cc\5\66\34\2\u00cb\u00ca\3\2\2"+
"\2\u00cc\u00cf\3\2\2\2\u00cd\u00cb\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\27"+
"\3\2\2\2\u00cf\u00cd\3\2\2\2\u00d0\u00d4\7\23\2\2\u00d1\u00d3\5\66\34"+
"\2\u00d2\u00d1\3\2\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d4\u00d5"+
"\3\2\2\2\u00d5\31\3\2\2\2\u00d6\u00d4\3\2\2\2\u00d7\u00d9\7\6\2\2\u00d8"+
"\u00da\5F$\2\u00d9\u00d8\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00db\3\2\2"+
"\2\u00db\u00dc\7\7\2\2\u00dc\33\3\2\2\2\u00dd\u00de\b\17\1\2\u00de\u00df"+
"\5\36\20\2\u00df\u00ea\3\2\2\2\u00e0\u00e1\f\4\2\2\u00e1\u00e9\7\23\2"+
"\2\u00e2\u00e3\f\3\2\2\u00e3\u00e5\7\6\2\2\u00e4\u00e6\5F$\2\u00e5\u00e4"+
"\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e9\7\7\2\2\u00e8"+
"\u00e0\3\2\2\2\u00e8\u00e2\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2"+
"\2\2\u00ea\u00eb\3\2\2\2\u00eb\35\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee"+
"\b\20\1\2\u00ee\u00ef\7\b\2\2\u00ef\u00f0\5\36\20\2\u00f0\u00f1\7\t\2"+
"\2\u00f1\u00fd\3\2\2\2\u00f2\u00fd\7\\\2\2\u00f3\u00f5\7[\2\2\u00f4\u00f6"+
"\7\\\2\2\u00f5\u00f4\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00fd\3\2\2\2\u00f7"+
"\u00fd\5\"\22\2\u00f8\u00fd\5 \21\2\u00f9\u00fd\5(\25\2\u00fa\u00fd\5"+
"&\24\2\u00fb\u00fd\7\3\2\2\u00fc\u00ed\3\2\2\2\u00fc\u00f2\3\2\2\2\u00fc"+
"\u00f3\3\2\2\2\u00fc\u00f7\3\2\2\2\u00fc\u00f8\3\2\2\2\u00fc\u00f9\3\2"+
"\2\2\u00fc\u00fa\3\2\2\2\u00fc\u00fb\3\2\2\2\u00fd\u0109\3\2\2\2\u00fe"+
"\u00ff\f\t\2\2\u00ff\u0101\7\6\2\2\u0100\u0102\5F$\2\u0101\u0100\3\2\2"+
"\2\u0101\u0102\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0108\7\7\2\2\u0104\u0105"+
"\f\b\2\2\u0105\u0106\7\b\2\2\u0106\u0108\7\t\2\2\u0107\u00fe\3\2\2\2\u0107"+
"\u0104\3\2\2\2\u0108\u010b\3\2\2\2\u0109\u0107\3\2\2\2\u0109\u010a\3\2"+
"\2\2\u010a\37\3\2\2\2\u010b\u0109\3\2\2\2\u010c\u010d\7P\2\2\u010d\u010e"+
"\7j\2\2\u010e!\3\2\2\2\u010f\u0111\7P\2\2\u0110\u0112\7j\2\2\u0111\u0110"+
"\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0115\7\4\2\2\u0114"+
"\u0116\5$\23\2\u0115\u0114\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0115\3\2"+
"\2\2\u0117\u0118\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011a\7\5\2\2\u011a"+
"#\3\2\2\2\u011b\u011c\5\16\b\2\u011c\u011d\7\n\2\2\u011d%\3\2\2\2\u011e"+
"\u011f\7Q\2\2\u011f\u0120\7j\2\2\u0120\'\3\2\2\2\u0121\u0123\7Q\2\2\u0122"+
"\u0124\7j\2\2\u0123\u0122\3\2\2\2\u0123\u0124\3\2\2\2\u0124\u0125\3\2"+
"\2\2\u0125\u0126\7\4\2\2\u0126\u0127\5*\26\2\u0127\u0128\7\5\2\2\u0128"+
")\3\2\2\2\u0129\u012a\b\26\1\2\u012a\u012b\5,\27\2\u012b\u0131\3\2\2\2"+
"\u012c\u012d\f\3\2\2\u012d\u012e\7\f\2\2\u012e\u0130\5,\27\2\u012f\u012c"+
"\3\2\2\2\u0130\u0133\3\2\2\2\u0131\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132"+
"+\3\2\2\2\u0133\u0131\3\2\2\2\u0134\u0137\7j\2\2\u0135\u0136\7&\2\2\u0136"+
"\u0138\5F$\2\u0137\u0135\3\2\2\2\u0137\u0138\3\2\2\2\u0138-\3\2\2\2\u0139"+
"\u013d\5\26\f\2\u013a\u013c\5\30\r\2\u013b\u013a\3\2\2\2\u013c\u013f\3"+
"\2\2\2\u013d\u013b\3\2\2\2\u013d\u013e\3\2\2\2\u013e\u0140\3\2\2\2\u013f"+
"\u013d\3\2\2\2\u0140\u0141\7j\2\2\u0141\u0143\7\b\2\2\u0142\u0144\5\60"+
"\31\2\u0143\u0142\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0145\3\2\2\2\u0145"+
"\u0146\7\t\2\2\u0146\u0148\7\4\2\2\u0147\u0149\58\35\2\u0148\u0147\3\2"+
"\2\2\u0148\u0149\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u014b\7\5\2\2\u014b"+
"/\3\2\2\2\u014c\u0151\5\62\32\2\u014d\u014e\7\f\2\2\u014e\u0150\5\62\32"+
"\2\u014f\u014d\3\2\2\2\u0150\u0153\3\2\2\2\u0151\u014f\3\2\2\2\u0151\u0152"+
"\3\2\2\2\u0152\61\3\2\2\2\u0153\u0151\3\2\2\2\u0154\u0158\5\26\f\2\u0155"+
"\u0157\5\30\r\2\u0156\u0155\3\2\2\2\u0157\u015a\3\2\2\2\u0158\u0156\3"+
"\2\2\2\u0158\u0159\3\2\2\2\u0159\u015b\3\2\2\2\u015a\u0158\3\2\2\2\u015b"+
"\u015c\7j\2\2\u015c\u015f\3\2\2\2\u015d\u015f\7\\\2\2\u015e\u0154\3\2"+
"\2\2\u015e\u015d\3\2\2\2\u015f\63\3\2\2\2\u0160\u0161\7*\2\2\u0161\u0162"+
"\7+\2\2\u0162\u0163\3\2\2\2\u0163\u0164\7\b\2\2\u0164\u0169\7a\2\2\u0165"+
"\u0166\7\f\2\2\u0166\u0168\7a\2\2\u0167\u0165\3\2\2\2\u0168\u016b\3\2"+
"\2\2\u0169\u0167\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\3\2\2\2\u016b"+
"\u0169\3\2\2\2\u016c\u01ab\7\t\2\2\u016d\u016e\7*\2\2\u016e\u016f\7,\2"+
"\2\u016f\u0170\3\2\2\2\u0170\u0171\7\b\2\2\u0171\u0172\7a\2\2\u0172\u01ab"+
"\7\t\2\2\u0173\u0174\7*\2\2\u0174\u0175\7-\2\2\u0175\u0176\3\2\2\2\u0176"+
"\u0177\7\b\2\2\u0177\u0178\7j\2\2\u0178\u01ab\7\t\2\2\u0179\u017a\7*\2"+
"\2\u017a\u017b\7/\2\2\u017b\u017c\3\2\2\2\u017c\u017d\7\b\2\2\u017d\u017e"+
"\7j\2\2\u017e\u01ab\7\t\2\2\u017f\u0180\7*\2\2\u0180\u0181\7.\2\2\u0181"+
"\u0182\3\2\2\2\u0182\u0183\7\b\2\2\u0183\u0184\7_\2\2\u0184\u01ab\7\t"+
"\2\2\u0185\u0186\7*\2\2\u0186\u0187\7\60\2\2\u0187\u0188\3\2\2\2\u0188"+
"\u0189\7\b\2\2\u0189\u018a\7j\2\2\u018a\u01ab\7\t\2\2\u018b\u018c\7*\2"+
"\2\u018c\u018d\7\61\2\2\u018d\u018e\3\2\2\2\u018e\u018f\7\b\2\2\u018f"+
"\u0190\7j\2\2\u0190\u01ab\7\t\2\2\u0191\u0192\7*\2\2\u0192\u0193\7\62"+
"\2\2\u0193\u0194\3\2\2\2\u0194\u0195\7\b\2\2\u0195\u0196\7j\2\2\u0196"+
"\u01ab\7\t\2\2\u0197\u0198\7*\2\2\u0198\u0199\7A\2\2\u0199\u019a\3\2\2"+
"\2\u019a\u019b\7\b\2\2\u019b\u019c\7B\2\2\u019c\u01ab\7\t\2\2\u019d\u019e"+
"\7*\2\2\u019e\u019f\7C\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\7\b\2\2\u01a1"+
"\u01a6\7j\2\2\u01a2\u01a3\7\f\2\2\u01a3\u01a5\7j\2\2\u01a4\u01a2\3\2\2"+
"\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a9"+
"\3\2\2\2\u01a8\u01a6\3\2\2\2\u01a9\u01ab\7\t\2\2\u01aa\u0160\3\2\2\2\u01aa"+
"\u016d\3\2\2\2\u01aa\u0173\3\2\2\2\u01aa\u0179\3\2\2\2\u01aa\u017f\3\2"+
"\2\2\u01aa\u0185\3\2\2\2\u01aa\u018b\3\2\2\2\u01aa\u0191\3\2\2\2\u01aa"+
"\u0197\3\2\2\2\u01aa\u019d\3\2\2\2\u01ab\65\3\2\2\2\u01ac\u01d7\7\63\2"+
"\2\u01ad\u01ae\7\66\2\2\u01ae\u01af\7\b\2\2\u01af\u01b0\7a\2\2\u01b0\u01d7"+
"\7\t\2\2\u01b1\u01b5\7;\2\2\u01b2\u01b3\7\b\2\2\u01b3\u01b4\7j\2\2\u01b4"+
"\u01b6\7\t\2\2\u01b5\u01b2\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01d7\3\2"+
"\2\2\u01b7\u01d7\7=\2\2\u01b8\u01d7\7>\2\2\u01b9\u01ba\7<\2\2\u01ba\u01bb"+
"\7\b\2\2\u01bb\u01bc\7a\2\2\u01bc\u01d7\7\t\2\2\u01bd\u01d7\78\2\2\u01be"+
"\u01d7\79\2\2\u01bf\u01d7\7?\2\2\u01c0\u01d7\7@\2\2\u01c1\u01d7\7\64\2"+
"\2\u01c2\u01d7\7\65\2\2\u01c3\u01d7\7\67\2\2\u01c4\u01c8\7:\2\2\u01c5"+
"\u01c6\7\b\2\2\u01c6\u01c7\7j\2\2\u01c7\u01c9\7\t\2\2\u01c8\u01c5\3\2"+
"\2\2\u01c8\u01c9\3\2\2\2\u01c9\u01d7\3\2\2\2\u01ca\u01cb\7+\2\2\u01cb"+
"\u01cc\7\b\2\2\u01cc\u01d1\7a\2\2\u01cd\u01ce\7\f\2\2\u01ce\u01d0\7a\2"+
"\2\u01cf\u01cd\3\2\2\2\u01d0\u01d3\3\2\2\2\u01d1\u01cf\3\2\2\2\u01d1\u01d2"+
"\3\2\2\2\u01d2\u01d4\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d4\u01d7\7\t\2\2\u01d5"+
"\u01d7\7B\2\2\u01d6\u01ac\3\2\2\2\u01d6\u01ad\3\2\2\2\u01d6\u01b1\3\2"+
"\2\2\u01d6\u01b7\3\2\2\2\u01d6\u01b8\3\2\2\2\u01d6\u01b9\3\2\2\2\u01d6"+
"\u01bd\3\2\2\2\u01d6\u01be\3\2\2\2\u01d6\u01bf\3\2\2\2\u01d6\u01c0\3\2"+
"\2\2\u01d6\u01c1\3\2\2\2\u01d6\u01c2\3\2\2\2\u01d6\u01c3\3\2\2\2\u01d6"+
"\u01c4\3\2\2\2\u01d6\u01ca\3\2\2\2\u01d6\u01d5\3\2\2\2\u01d7\67\3\2\2"+
"\2\u01d8\u01da\5:\36\2\u01d9\u01d8\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01d9"+
"\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc9\3\2\2\2\u01dd\u01de\5\16\b\2\u01de"+
"\u01df\7\n\2\2\u01df\u0232\3\2\2\2\u01e0\u01e2\7\4\2\2\u01e1\u01e3\58"+
"\35\2\u01e2\u01e1\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4"+
"\u0232\7\5\2\2\u01e5\u01e6\5D#\2\u01e6\u01e7\7\n\2\2\u01e7\u0232\3\2\2"+
"\2\u01e8\u01e9\7D\2\2\u01e9\u01ea\7\b\2\2\u01ea\u01eb\5D#\2\u01eb\u01ec"+
"\7\t\2\2\u01ec\u01ef\5:\36\2\u01ed\u01ee\7E\2\2\u01ee\u01f0\5:\36\2\u01ef"+
"\u01ed\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u0232\3\2\2\2\u01f1\u01f3\5\66"+
"\34\2\u01f2\u01f1\3\2\2\2\u01f3\u01f6\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4"+
"\u01f5\3\2\2\2\u01f5\u01f7\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f7\u01f8\7F"+
"\2\2\u01f8\u01f9\7\b\2\2\u01f9\u01fa\5D#\2\u01fa\u01fb\7\t\2\2\u01fb\u01fc"+
"\5:\36\2\u01fc\u0232\3\2\2\2\u01fd\u01ff\5\66\34\2\u01fe\u01fd\3\2\2\2"+
"\u01ff\u0202\3\2\2\2\u0200\u01fe\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u0203"+
"\3\2\2\2\u0202\u0200\3\2\2\2\u0203\u0204\7G\2\2\u0204\u0205\5:\36\2\u0205"+
"\u0206\7F\2\2\u0206\u0207\7\b\2\2\u0207\u0208\5D#\2\u0208\u0209\7\t\2"+
"\2\u0209\u020a\7\n\2\2\u020a\u0232\3\2\2\2\u020b\u020d\5\66\34\2\u020c"+
"\u020b\3\2\2\2\u020d\u0210\3\2\2\2\u020e\u020c\3\2\2\2\u020e\u020f\3\2"+
"\2\2\u020f\u0211\3\2\2\2\u0210\u020e\3\2\2\2\u0211\u0212\7H\2\2\u0212"+
"\u0213\7\b\2\2\u0213\u0214\5@!\2\u0214\u0215\7\t\2\2\u0215\u0216\5:\36"+
"\2\u0216\u0232\3\2\2\2\u0217\u0218\7I\2\2\u0218\u0219\7\b\2\2\u0219\u021a"+
"\5D#\2\u021a\u021b\7\t\2\2\u021b\u021c\7\4\2\2\u021c\u021d\5<\37\2\u021d"+
"\u021e\7\5\2\2\u021e\u0232\3\2\2\2\u021f\u0221\7J\2\2\u0220\u0222\5D#"+
"\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0232"+
"\7\n\2\2\u0224\u0225\7K\2\2\u0225\u0232\7\n\2\2\u0226\u0227\7L\2\2\u0227"+
"\u0232\7\n\2\2\u0228\u022a\7M\2\2\u0229\u022b\5L\'\2\u022a\u0229\3\2\2"+
"\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u022d\7\4\2\2\u022d\u022e"+
"\5P)\2\u022e\u022f\7\u0081\2\2\u022f\u0232\3\2\2\2\u0230\u0232\5J&\2\u0231"+
"\u01dd\3\2\2\2\u0231\u01e0\3\2\2\2\u0231\u01e5\3\2\2\2\u0231\u01e8\3\2"+
"\2\2\u0231\u01f4\3\2\2\2\u0231\u0200\3\2\2\2\u0231\u020e\3\2\2\2\u0231"+
"\u0217\3\2\2\2\u0231\u021f\3\2\2\2\u0231\u0224\3\2\2\2\u0231\u0226\3\2"+
"\2\2\u0231\u0228\3\2\2\2\u0231\u0230\3\2\2\2\u0232;\3\2\2\2\u0233\u0235"+
"\5> \2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0234\3\2\2\2\u0236"+
"\u0237\3\2\2\2\u0237\u023d\3\2\2\2\u0238\u0239\7N\2\2\u0239\u023b\7\13"+
"\2\2\u023a\u023c\58\35\2\u023b\u023a\3\2\2\2\u023b\u023c\3\2\2\2\u023c"+
"\u023e\3\2\2\2\u023d\u0238\3\2\2\2\u023d\u023e\3\2\2\2\u023e=\3\2\2\2"+
"\u023f\u0240\7O\2\2\u0240\u0241\5F$\2\u0241\u0243\7\13\2\2\u0242\u0244"+
"\58\35\2\u0243\u0242\3\2\2\2\u0243\u0244\3\2\2\2\u0244?\3\2\2\2\u0245"+
"\u0246\5B\"\2\u0246\u0247\7\n\2\2\u0247\u0248\5D#\2\u0248\u024a\7\n\2"+
"\2\u0249\u024b\5D#\2\u024a\u0249\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u025c"+
"\3\2\2\2\u024c\u0250\5\26\f\2\u024d\u024f\5\30\r\2\u024e\u024d\3\2\2\2"+
"\u024f\u0252\3\2\2\2\u0250\u024e\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0254"+
"\3\2\2\2\u0252\u0250\3\2\2\2\u0253\u024c\3\2\2\2\u0253\u0254\3\2\2\2\u0254"+
"\u0255\3\2\2\2\u0255\u0256\7j\2\2\u0256\u0257\7\13\2\2\u0257\u0258\5F"+
"$\2\u0258\u0259\7\r\2\2\u0259\u025a\5F$\2\u025a\u025c\3\2\2\2\u025b\u0245"+
"\3\2\2\2\u025b\u0253\3\2\2\2\u025cA\3\2\2\2\u025d\u025f\5\16\b\2\u025e"+
"\u025d\3\2\2\2\u025e\u025f\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u0262\5D"+
"#\2\u0261\u025e\3\2\2\2\u0261\u0260\3\2\2\2\u0262C\3\2\2\2\u0263\u0264"+
"\b#\1\2\u0264\u0265\5F$\2\u0265\u026b\3\2\2\2\u0266\u0267\f\3\2\2\u0267"+
"\u0268\7\f\2\2\u0268\u026a\5F$\2\u0269\u0266\3\2\2\2\u026a\u026d\3\2\2"+
"\2\u026b\u0269\3\2\2\2\u026b\u026c\3\2\2\2\u026cE\3\2\2\2\u026d\u026b"+
"\3\2\2\2\u026e\u026f\b$\1\2\u026f\u0270\7\b\2\2\u0270\u0271\5D#\2\u0271"+
"\u0272\7\t\2\2\u0272\u02a5\3\2\2\2\u0273\u0274\7R\2\2\u0274\u0277\7\b"+
"\2\2\u0275\u0278\5F$\2\u0276\u0278\5\34\17\2\u0277\u0275\3\2\2\2\u0277"+
"\u0276\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027a\7\t\2\2\u027a\u02a5\3\2"+
"\2\2\u027b\u027c\7S\2\2\u027c\u027f\7\b\2\2\u027d\u0280\5F$\2\u027e\u0280"+
"\5\34\17\2\u027f\u027d\3\2\2\2\u027f\u027e\3\2\2\2\u0280\u0281\3\2\2\2"+
"\u0281\u0282\7\t\2\2\u0282\u02a5\3\2\2\2\u0283\u0284\7\b\2\2\u0284\u0285"+
"\5\34\17\2\u0285\u0286\7\t\2\2\u0286\u0287\5F$\32\u0287\u02a5\3\2\2\2"+
"\u0288\u0289\t\2\2\2\u0289\u02a5\5F$\31\u028a\u028b\7\23\2\2\u028b\u02a5"+
"\5F$\27\u028c\u028d\t\3\2\2\u028d\u02a5\5F$\26\u028e\u028f\t\4\2\2\u028f"+
"\u02a5\5F$\22\u0290\u0291\7\4\2\2\u0291\u0296\5F$\2\u0292\u0293\7\f\2"+
"\2\u0293\u0295\5F$\2\u0294\u0292\3\2\2\2\u0295\u0298\3\2\2\2\u0296\u0294"+
"\3\2\2\2\u0296\u0297\3\2\2\2\u0297\u0299\3\2\2\2\u0298\u0296\3\2\2\2\u0299"+
"\u029a\7\5\2\2\u029a\u02a5\3\2\2\2\u029b\u02a5\7j\2\2\u029c\u02a5\7a\2"+
"\2\u029d\u029f\7_\2\2\u029e\u029d\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0\u029e"+
"\3\2\2\2\u02a0\u02a1\3\2\2\2\u02a1\u02a5\3\2\2\2\u02a2\u02a5\7`\2\2\u02a3"+
"\u02a5\7]\2\2\u02a4\u026e\3\2\2\2\u02a4\u0273\3\2\2\2\u02a4\u027b\3\2"+
"\2\2\u02a4\u0283\3\2\2\2\u02a4\u0288\3\2\2\2\u02a4\u028a\3\2\2\2\u02a4"+
"\u028c\3\2\2\2\u02a4\u028e\3\2\2\2\u02a4\u0290\3\2\2\2\u02a4\u029b\3\2"+
"\2\2\u02a4\u029c\3\2\2\2\u02a4\u029e\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a4"+
"\u02a3\3\2\2\2\u02a5\u02e2\3\2\2\2\u02a6\u02a7\f\25\2\2\u02a7\u02a8\t"+
"\5\2\2\u02a8\u02e1\5F$\26\u02a9\u02aa\f\24\2\2\u02aa\u02ab\t\6\2\2\u02ab"+
"\u02e1\5F$\25\u02ac\u02ad\f\23\2\2\u02ad\u02ae\t\7\2\2\u02ae\u02e1\5F"+
"$\24\u02af\u02b0\f\21\2\2\u02b0\u02b1\t\b\2\2\u02b1\u02e1\5F$\22\u02b2"+
"\u02b3\f\20\2\2\u02b3\u02b4\7\30\2\2\u02b4\u02e1\5F$\21\u02b5\u02b6\f"+
"\17\2\2\u02b6\u02b7\7\32\2\2\u02b7\u02e1\5F$\20\u02b8\u02b9\f\16\2\2\u02b9"+
"\u02ba\7\33\2\2\u02ba\u02e1\5F$\17\u02bb\u02bc\f\r\2\2\u02bc\u02bd\7$"+
"\2\2\u02bd\u02e1\5F$\16\u02be\u02bf\f\f\2\2\u02bf\u02c0\7%\2\2\u02c0\u02e1"+
"\5F$\r\u02c1\u02c2\f\13\2\2\u02c2\u02c3\7\16\2\2\u02c3\u02c4\5F$\2\u02c4"+
"\u02c5\7\13\2\2\u02c5\u02c6\5F$\f\u02c6\u02e1\3\2\2\2\u02c7\u02c8\f\n"+
"\2\2\u02c8\u02c9\7&\2\2\u02c9\u02e1\5F$\n\u02ca\u02cb\f\t\2\2\u02cb\u02cc"+
"\7\'\2\2\u02cc\u02e1\5F$\t\u02cd\u02ce\f \2\2\u02ce\u02cf\7\17\2\2\u02cf"+
"\u02e1\7j\2\2\u02d0\u02d1\f\37\2\2\u02d1\u02d2\7\20\2\2\u02d2\u02e1\7"+
"j\2\2\u02d3\u02d4\f\36\2\2\u02d4\u02d6\7\b\2\2\u02d5\u02d7\5H%\2\u02d6"+
"\u02d5\3\2\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02e1\7\t"+
"\2\2\u02d9\u02da\f\33\2\2\u02da\u02db\7\6\2\2\u02db\u02dc\5D#\2\u02dc"+
"\u02dd\7\7\2\2\u02dd\u02e1\3\2\2\2\u02de\u02df\f\30\2\2\u02df\u02e1\t"+
"\2\2\2\u02e0\u02a6\3\2\2\2\u02e0\u02a9\3\2\2\2\u02e0\u02ac\3\2\2\2\u02e0"+
"\u02af\3\2\2\2\u02e0\u02b2\3\2\2\2\u02e0\u02b5\3\2\2\2\u02e0\u02b8\3\2"+
"\2\2\u02e0\u02bb\3\2\2\2\u02e0\u02be\3\2\2\2\u02e0\u02c1\3\2\2\2\u02e0"+
"\u02c7\3\2\2\2\u02e0\u02ca\3\2\2\2\u02e0\u02cd\3\2\2\2\u02e0\u02d0\3\2"+
"\2\2\u02e0\u02d3\3\2\2\2\u02e0\u02d9\3\2\2\2\u02e0\u02de\3\2\2\2\u02e1"+
"\u02e4\3\2\2\2\u02e2\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3G\3\2\2\2"+
"\u02e4\u02e2\3\2\2\2\u02e5\u02ea\5F$\2\u02e6\u02e7\7\f\2\2\u02e7\u02e9"+
"\5F$\2\u02e8\u02e6\3\2\2\2\u02e9\u02ec\3\2\2\2\u02ea\u02e8\3\2\2\2\u02ea"+
"\u02eb\3\2\2\2\u02ebI\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ed\u02ef\7T\2\2\u02ee"+
"\u02f0\5L\'\2\u02ef\u02ee\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2"+
"\2\2\u02f1\u02f2\7^\2\2\u02f2K\3\2\2\2\u02f3\u02f4\7\b\2\2\u02f4\u02f9"+
"\5N(\2\u02f5\u02f6\7\f\2\2\u02f6\u02f8\5N(\2\u02f7\u02f5\3\2\2\2\u02f8"+
"\u02fb\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\3\2"+
"\2\2\u02fb\u02f9\3\2\2\2\u02fc\u02fd\7\t\2\2\u02fdM\3\2\2\2\u02fe\u02ff"+
"\7U\2\2\u02ff\u030e\7_\2\2\u0300\u0301\7V\2\2\u0301\u030e\7j\2\2\u0302"+
"\u0303\7W\2\2\u0303\u030e\7_\2\2\u0304\u0305\7X\2\2\u0305\u030e\5F$\2"+
"\u0306\u0307\7Y\2\2\u0307\u030e\5F$\2\u0308\u030b\7,\2\2\u0309\u030c\7"+
"\67\2\2\u030a\u030c\5F$\2\u030b\u0309\3\2\2\2\u030b\u030a\3\2\2\2\u030c"+
"\u030e\3\2\2\2\u030d\u02fe\3\2\2\2\u030d\u0300\3\2\2\2\u030d\u0302\3\2"+
"\2\2\u030d\u0304\3\2\2\2\u030d\u0306\3\2\2\2\u030d\u0308\3\2\2\2\u030e"+
"O\3\2\2\2\u030f\u0311\5R*\2\u0310\u030f\3\2\2\2\u0311\u0314\3\2\2\2\u0312"+
"\u0310\3\2\2\2\u0312\u0313\3\2\2\2\u0313Q\3\2\2\2\u0314\u0312\3\2\2\2"+
"\u0315\u0319\5T+\2\u0316\u0319\5V,\2\u0317\u0319\5X-\2\u0318\u0315\3\2"+
"\2\2\u0318\u0316\3\2\2\2\u0318\u0317\3\2\2\2\u0319S\3\2\2\2\u031a\u031b"+
"\7\u008e\2\2\u031b\u031f\7q\2\2\u031c\u031d\7\u008d\2\2\u031d\u031f\7"+
"q\2\2\u031e\u031a\3\2\2\2\u031e\u031c\3\2\2\2\u031fU\3\2\2\2\u0320\u0322"+
"\7o\2\2\u0321\u0323\5Z.\2\u0322\u0321\3\2\2\2\u0322\u0323\3\2\2\2\u0323"+
"W\3\2\2\2\u0324\u0325\7n\2\2\u0325\u032a\5\\/\2\u0326\u0327\7r\2\2\u0327"+
"\u0329\5\\/\2\u0328\u0326\3\2\2\2\u0329\u032c\3\2\2\2\u032a\u0328\3\2"+
"\2\2\u032a\u032b\3\2\2\2\u032bY\3\2\2\2\u032c\u032a\3\2\2\2\u032d\u0345"+
"\5\\/\2\u032e\u032f\7p\2\2\u032f\u0345\5\\/\2\u0330\u0331\5\\/\2\u0331"+
"\u0332\7r\2\2\u0332\u0333\7\u008e\2\2\u0333\u0345\3\2\2\2\u0334\u0335"+
"\7s\2\2\u0335\u0336\5\\/\2\u0336\u0337\7t\2\2\u0337\u0338\7r\2\2\u0338"+
"\u0339\7\u008e\2\2\u0339\u0345\3\2\2\2\u033a\u033b\7s\2\2\u033b\u033c"+
"\5\\/\2\u033c\u033d\7r\2\2\u033d\u033e\7\u008e\2\2\u033e\u033f\7t\2\2"+
"\u033f\u0345\3\2\2\2\u0340\u0341\7s\2\2\u0341\u0342\5\\/\2\u0342\u0343"+
"\7t\2\2\u0343\u0345\3\2\2\2\u0344\u032d\3\2\2\2\u0344\u032e\3\2\2\2\u0344"+
"\u0330\3\2\2\2\u0344\u0334\3\2\2\2\u0344\u033a\3\2\2\2\u0344\u0340\3\2"+
"\2\2\u0345[\3\2\2\2\u0346\u0347\b/\1\2\u0347\u0348\7u\2\2\u0348\u0349"+
"\5\\/\2\u0349\u034a\7v\2\2\u034a\u0355\3\2\2\2\u034b\u034c\t\t\2\2\u034c"+
"\u0355\5\\/\n\u034d\u0355\7\u008e\2\2\u034e\u0355\7\u008c\2\2\u034f\u0350"+
"\7\u0080\2\2\u0350\u0351\7\u008e\2\2\u0351\u0355\7\u0081\2\2\u0352\u0355"+
"\7\u0082\2\2\u0353\u0355\7\u008b\2\2\u0354\u0346\3\2\2\2\u0354\u034b\3"+
"\2\2\2\u0354\u034d\3\2\2\2\u0354\u034e\3\2\2\2\u0354\u034f\3\2\2\2\u0354"+
"\u0352\3\2\2\2\u0354\u0353\3\2\2\2\u0355\u0364\3\2\2\2\u0356\u0357\f\f"+
"\2\2\u0357\u0358\7w\2\2\u0358\u0363\5\\/\r\u0359\u035a\f\13\2\2\u035a"+
"\u035b\t\n\2\2\u035b\u0363\5\\/\f\u035c\u035d\f\t\2\2\u035d\u035e\t\13"+
"\2\2\u035e\u0363\5\\/\n\u035f\u0360\f\b\2\2\u0360\u0361\t\f\2\2\u0361"+
"\u0363\5\\/\t\u0362\u0356\3\2\2\2\u0362\u0359\3\2\2\2\u0362\u035c\3\2"+
"\2\2\u0362\u035f\3\2\2\2\u0363\u0366\3\2\2\2\u0364\u0362\3\2\2\2\u0364"+
"\u0365\3\2\2\2\u0365]\3\2\2\2\u0366\u0364\3\2\2\2Vgl\u0080\u0089\u0093"+
"\u0099\u00a1\u00a8\u00b1\u00b6\u00bc\u00c1\u00c6\u00cd\u00d4\u00d9\u00e5"+
"\u00e8\u00ea\u00f5\u00fc\u0101\u0107\u0109\u0111\u0117\u0123\u0131\u0137"+
"\u013d\u0143\u0148\u0151\u0158\u015e\u0169\u01a6\u01aa\u01b5\u01c8\u01d1"+
"\u01d6\u01db\u01e2\u01ef\u01f4\u0200\u020e\u0221\u022a\u0231\u0236\u023b"+
"\u023d\u0243\u024a\u0250\u0253\u025b\u025e\u0261\u026b\u0277\u027f\u0296"+
"\u02a0\u02a4\u02d6\u02e0\u02e2\u02ea\u02ef\u02f9\u030b\u030d\u0312\u0318"+
"\u031e\u0322\u032a\u0344\u0354\u0362\u0364";
"\35\3\2\23\25\3\2\21\22\3\2\36#\3\2|\177\3\2z{\3\2\u0080\u0081\3\2|}\2"+
"\u03e4\2^\3\2\2\2\4a\3\2\2\2\6g\3\2\2\2\bl\3\2\2\2\nn\3\2\2\2\f\u0080"+
"\3\2\2\2\16\u0082\3\2\2\2\20\u0085\3\2\2\2\22\u009c\3\2\2\2\24\u00c1\3"+
"\2\2\2\26\u00c6\3\2\2\2\30\u00d0\3\2\2\2\32\u00d7\3\2\2\2\34\u00dd\3\2"+
"\2\2\36\u00fc\3\2\2\2 \u010c\3\2\2\2\"\u010f\3\2\2\2$\u011b\3\2\2\2&\u011e"+
"\3\2\2\2(\u0121\3\2\2\2*\u0129\3\2\2\2,\u0134\3\2\2\2.\u0139\3\2\2\2\60"+
"\u014c\3\2\2\2\62\u015e\3\2\2\2\64\u01aa\3\2\2\2\66\u01d6\3\2\2\28\u01d9"+
"\3\2\2\2:\u0231\3\2\2\2<\u0234\3\2\2\2>\u023f\3\2\2\2@\u025b\3\2\2\2B"+
"\u0261\3\2\2\2D\u0263\3\2\2\2F\u02a4\3\2\2\2H\u02e5\3\2\2\2J\u02ed\3\2"+
"\2\2L\u02f3\3\2\2\2N\u030d\3\2\2\2P\u0312\3\2\2\2R\u0318\3\2\2\2T\u031e"+
"\3\2\2\2V\u0320\3\2\2\2X\u0324\3\2\2\2Z\u0344\3\2\2\2\\\u0354\3\2\2\2"+
"^_\5\6\4\2_`\7\2\2\3`\3\3\2\2\2ab\5P)\2bc\7\2\2\3c\5\3\2\2\2df\5\b\5\2"+
"ed\3\2\2\2fi\3\2\2\2ge\3\2\2\2gh\3\2\2\2h\7\3\2\2\2ig\3\2\2\2jm\5\f\7"+
"\2km\5\n\6\2lj\3\2\2\2lk\3\2\2\2m\t\3\2\2\2no\7(\2\2op\7_\2\2p\13\3\2"+
"\2\2qr\5\16\b\2rs\7\n\2\2s\u0081\3\2\2\2tu\5\"\22\2uv\7\n\2\2v\u0081\3"+
"\2\2\2wx\5(\25\2xy\7\n\2\2y\u0081\3\2\2\2z\u0081\5.\30\2{\u0081\5J&\2"+
"|\u0081\5\64\33\2}~\5\22\n\2~\177\7\n\2\2\177\u0081\3\2\2\2\u0080q\3\2"+
"\2\2\u0080t\3\2\2\2\u0080w\3\2\2\2\u0080z\3\2\2\2\u0080{\3\2\2\2\u0080"+
"|\3\2\2\2\u0080}\3\2\2\2\u0081\r\3\2\2\2\u0082\u0083\5\26\f\2\u0083\u0084"+
"\5\20\t\2\u0084\17\3\2\2\2\u0085\u0089\b\t\1\2\u0086\u0088\5\30\r\2\u0087"+
"\u0086\3\2\2\2\u0088\u008b\3\2\2\2\u0089\u0087\3\2\2\2\u0089\u008a\3\2"+
"\2\2\u008a\u008c\3\2\2\2\u008b\u0089\3\2\2\2\u008c\u008d\5\24\13\2\u008d"+
"\u0099\3\2\2\2\u008e\u008f\f\3\2\2\u008f\u0093\7\f\2\2\u0090\u0092\5\30"+
"\r\2\u0091\u0090\3\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2\2\2\u0093"+
"\u0094\3\2\2\2\u0094\u0096\3\2\2\2\u0095\u0093\3\2\2\2\u0096\u0098\5\24"+
"\13\2\u0097\u008e\3\2\2\2\u0098\u009b\3\2\2\2\u0099\u0097\3\2\2\2\u0099"+
"\u009a\3\2\2\2\u009a\21\3\2\2\2\u009b\u0099\3\2\2\2\u009c\u009d\7)\2\2"+
"\u009d\u00a1\5\26\f\2\u009e\u00a0\5\30\r\2\u009f\u009e\3\2\2\2\u00a0\u00a3"+
"\3\2\2\2\u00a1\u009f\3\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\u00a4\3\2\2\2\u00a3"+
"\u00a1\3\2\2\2\u00a4\u00a8\7l\2\2\u00a5\u00a7\5\32\16\2\u00a6\u00a5\3"+
"\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9"+
"\u00ab\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00ac\b\n\1\2\u00ac\23\3\2\2"+
"\2\u00ad\u00b1\7l\2\2\u00ae\u00b0\5\32\16\2\u00af\u00ae\3\2\2\2\u00b0"+
"\u00b3\3\2\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b6\3\2"+
"\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\7&\2\2\u00b5\u00b7\5F$\2\u00b6\u00b4"+
"\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00c2\3\2\2\2\u00b8\u00bc\7l\2\2\u00b9"+
"\u00bb\5\32\16\2\u00ba\u00b9\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc\u00ba\3"+
"\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\3\2\2\2\u00be\u00bc\3\2\2\2\u00bf"+
"\u00c0\7&\2\2\u00c0\u00c2\5J&\2\u00c1\u00ad\3\2\2\2\u00c1\u00b8\3\2\2"+
"\2\u00c2\25\3\2\2\2\u00c3\u00c5\5\66\34\2\u00c4\u00c3\3\2\2\2\u00c5\u00c8"+
"\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00c9\3\2\2\2\u00c8"+
"\u00c6\3\2\2\2\u00c9\u00cd\5\36\20\2\u00ca\u00cc\5\66\34\2\u00cb\u00ca"+
"\3\2\2\2\u00cc\u00cf\3\2\2\2\u00cd\u00cb\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce"+
"\27\3\2\2\2\u00cf\u00cd\3\2\2\2\u00d0\u00d4\7\23\2\2\u00d1\u00d3\5\66"+
"\34\2\u00d2\u00d1\3\2\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d4"+
"\u00d5\3\2\2\2\u00d5\31\3\2\2\2\u00d6\u00d4\3\2\2\2\u00d7\u00d9\7\6\2"+
"\2\u00d8\u00da\5F$\2\u00d9\u00d8\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00db"+
"\3\2\2\2\u00db\u00dc\7\7\2\2\u00dc\33\3\2\2\2\u00dd\u00de\b\17\1\2\u00de"+
"\u00df\5\36\20\2\u00df\u00ea\3\2\2\2\u00e0\u00e1\f\4\2\2\u00e1\u00e9\7"+
"\23\2\2\u00e2\u00e3\f\3\2\2\u00e3\u00e5\7\6\2\2\u00e4\u00e6\5F$\2\u00e5"+
"\u00e4\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e9\7\7"+
"\2\2\u00e8\u00e0\3\2\2\2\u00e8\u00e2\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea"+
"\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\35\3\2\2\2\u00ec\u00ea\3\2\2"+
"\2\u00ed\u00ee\b\20\1\2\u00ee\u00ef\7\b\2\2\u00ef\u00f0\5\36\20\2\u00f0"+
"\u00f1\7\t\2\2\u00f1\u00fd\3\2\2\2\u00f2\u00fd\7\\\2\2\u00f3\u00f5\7["+
"\2\2\u00f4\u00f6\7\\\2\2\u00f5\u00f4\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6"+
"\u00fd\3\2\2\2\u00f7\u00fd\5\"\22\2\u00f8\u00fd\5 \21\2\u00f9\u00fd\5"+
"(\25\2\u00fa\u00fd\5&\24\2\u00fb\u00fd\7\3\2\2\u00fc\u00ed\3\2\2\2\u00fc"+
"\u00f2\3\2\2\2\u00fc\u00f3\3\2\2\2\u00fc\u00f7\3\2\2\2\u00fc\u00f8\3\2"+
"\2\2\u00fc\u00f9\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fc\u00fb\3\2\2\2\u00fd"+
"\u0109\3\2\2\2\u00fe\u00ff\f\t\2\2\u00ff\u0101\7\6\2\2\u0100\u0102\5F"+
"$\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103\3\2\2\2\u0103"+
"\u0108\7\7\2\2\u0104\u0105\f\b\2\2\u0105\u0106\7\b\2\2\u0106\u0108\7\t"+
"\2\2\u0107\u00fe\3\2\2\2\u0107\u0104\3\2\2\2\u0108\u010b\3\2\2\2\u0109"+
"\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a\37\3\2\2\2\u010b\u0109\3\2\2"+
"\2\u010c\u010d\7P\2\2\u010d\u010e\7l\2\2\u010e!\3\2\2\2\u010f\u0111\7"+
"P\2\2\u0110\u0112\7l\2\2\u0111\u0110\3\2\2\2\u0111\u0112\3\2\2\2\u0112"+
"\u0113\3\2\2\2\u0113\u0115\7\4\2\2\u0114\u0116\5$\23\2\u0115\u0114\3\2"+
"\2\2\u0116\u0117\3\2\2\2\u0117\u0115\3\2\2\2\u0117\u0118\3\2\2\2\u0118"+
"\u0119\3\2\2\2\u0119\u011a\7\5\2\2\u011a#\3\2\2\2\u011b\u011c\5\16\b\2"+
"\u011c\u011d\7\n\2\2\u011d%\3\2\2\2\u011e\u011f\7Q\2\2\u011f\u0120\7l"+
"\2\2\u0120\'\3\2\2\2\u0121\u0123\7Q\2\2\u0122\u0124\7l\2\2\u0123\u0122"+
"\3\2\2\2\u0123\u0124\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\7\4\2\2\u0126"+
"\u0127\5*\26\2\u0127\u0128\7\5\2\2\u0128)\3\2\2\2\u0129\u012a\b\26\1\2"+
"\u012a\u012b\5,\27\2\u012b\u0131\3\2\2\2\u012c\u012d\f\3\2\2\u012d\u012e"+
"\7\f\2\2\u012e\u0130\5,\27\2\u012f\u012c\3\2\2\2\u0130\u0133\3\2\2\2\u0131"+
"\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132+\3\2\2\2\u0133\u0131\3\2\2\2"+
"\u0134\u0137\7l\2\2\u0135\u0136\7&\2\2\u0136\u0138\5F$\2\u0137\u0135\3"+
"\2\2\2\u0137\u0138\3\2\2\2\u0138-\3\2\2\2\u0139\u013d\5\26\f\2\u013a\u013c"+
"\5\30\r\2\u013b\u013a\3\2\2\2\u013c\u013f\3\2\2\2\u013d\u013b\3\2\2\2"+
"\u013d\u013e\3\2\2\2\u013e\u0140\3\2\2\2\u013f\u013d\3\2\2\2\u0140\u0141"+
"\7l\2\2\u0141\u0143\7\b\2\2\u0142\u0144\5\60\31\2\u0143\u0142\3\2\2\2"+
"\u0143\u0144\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\7\t\2\2\u0146\u0148"+
"\7\4\2\2\u0147\u0149\58\35\2\u0148\u0147\3\2\2\2\u0148\u0149\3\2\2\2\u0149"+
"\u014a\3\2\2\2\u014a\u014b\7\5\2\2\u014b/\3\2\2\2\u014c\u0151\5\62\32"+
"\2\u014d\u014e\7\f\2\2\u014e\u0150\5\62\32\2\u014f\u014d\3\2\2\2\u0150"+
"\u0153\3\2\2\2\u0151\u014f\3\2\2\2\u0151\u0152\3\2\2\2\u0152\61\3\2\2"+
"\2\u0153\u0151\3\2\2\2\u0154\u0158\5\26\f\2\u0155\u0157\5\30\r\2\u0156"+
"\u0155\3\2\2\2\u0157\u015a\3\2\2\2\u0158\u0156\3\2\2\2\u0158\u0159\3\2"+
"\2\2\u0159\u015b\3\2\2\2\u015a\u0158\3\2\2\2\u015b\u015c\7l\2\2\u015c"+
"\u015f\3\2\2\2\u015d\u015f\7\\\2\2\u015e\u0154\3\2\2\2\u015e\u015d\3\2"+
"\2\2\u015f\63\3\2\2\2\u0160\u0161\7*\2\2\u0161\u0162\7+\2\2\u0162\u0163"+
"\3\2\2\2\u0163\u0164\7\b\2\2\u0164\u0169\7c\2\2\u0165\u0166\7\f\2\2\u0166"+
"\u0168\7c\2\2\u0167\u0165\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u0167\3\2"+
"\2\2\u0169\u016a\3\2\2\2\u016a\u016c\3\2\2\2\u016b\u0169\3\2\2\2\u016c"+
"\u01ab\7\t\2\2\u016d\u016e\7*\2\2\u016e\u016f\7,\2\2\u016f\u0170\3\2\2"+
"\2\u0170\u0171\7\b\2\2\u0171\u0172\7c\2\2\u0172\u01ab\7\t\2\2\u0173\u0174"+
"\7*\2\2\u0174\u0175\7-\2\2\u0175\u0176\3\2\2\2\u0176\u0177\7\b\2\2\u0177"+
"\u0178\7l\2\2\u0178\u01ab\7\t\2\2\u0179\u017a\7*\2\2\u017a\u017b\7/\2"+
"\2\u017b\u017c\3\2\2\2\u017c\u017d\7\b\2\2\u017d\u017e\7l\2\2\u017e\u01ab"+
"\7\t\2\2\u017f\u0180\7*\2\2\u0180\u0181\7.\2\2\u0181\u0182\3\2\2\2\u0182"+
"\u0183\7\b\2\2\u0183\u0184\7_\2\2\u0184\u01ab\7\t\2\2\u0185\u0186\7*\2"+
"\2\u0186\u0187\7\60\2\2\u0187\u0188\3\2\2\2\u0188\u0189\7\b\2\2\u0189"+
"\u018a\7l\2\2\u018a\u01ab\7\t\2\2\u018b\u018c\7*\2\2\u018c\u018d\7\61"+
"\2\2\u018d\u018e\3\2\2\2\u018e\u018f\7\b\2\2\u018f\u0190\7l\2\2\u0190"+
"\u01ab\7\t\2\2\u0191\u0192\7*\2\2\u0192\u0193\7\62\2\2\u0193\u0194\3\2"+
"\2\2\u0194\u0195\7\b\2\2\u0195\u0196\7l\2\2\u0196\u01ab\7\t\2\2\u0197"+
"\u0198\7*\2\2\u0198\u0199\7A\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7\b\2"+
"\2\u019b\u019c\7B\2\2\u019c\u01ab\7\t\2\2\u019d\u019e\7*\2\2\u019e\u019f"+
"\7C\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\7\b\2\2\u01a1\u01a6\7l\2\2\u01a2"+
"\u01a3\7\f\2\2\u01a3\u01a5\7l\2\2\u01a4\u01a2\3\2\2\2\u01a5\u01a8\3\2"+
"\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a9\3\2\2\2\u01a8"+
"\u01a6\3\2\2\2\u01a9\u01ab\7\t\2\2\u01aa\u0160\3\2\2\2\u01aa\u016d\3\2"+
"\2\2\u01aa\u0173\3\2\2\2\u01aa\u0179\3\2\2\2\u01aa\u017f\3\2\2\2\u01aa"+
"\u0185\3\2\2\2\u01aa\u018b\3\2\2\2\u01aa\u0191\3\2\2\2\u01aa\u0197\3\2"+
"\2\2\u01aa\u019d\3\2\2\2\u01ab\65\3\2\2\2\u01ac\u01d7\7\63\2\2\u01ad\u01ae"+
"\7\66\2\2\u01ae\u01af\7\b\2\2\u01af\u01b0\7c\2\2\u01b0\u01d7\7\t\2\2\u01b1"+
"\u01b5\7;\2\2\u01b2\u01b3\7\b\2\2\u01b3\u01b4\7l\2\2\u01b4\u01b6\7\t\2"+
"\2\u01b5\u01b2\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01d7\3\2\2\2\u01b7\u01d7"+
"\7=\2\2\u01b8\u01d7\7>\2\2\u01b9\u01ba\7<\2\2\u01ba\u01bb\7\b\2\2\u01bb"+
"\u01bc\7c\2\2\u01bc\u01d7\7\t\2\2\u01bd\u01d7\78\2\2\u01be\u01d7\79\2"+
"\2\u01bf\u01d7\7?\2\2\u01c0\u01d7\7@\2\2\u01c1\u01d7\7\64\2\2\u01c2\u01d7"+
"\7\65\2\2\u01c3\u01d7\7\67\2\2\u01c4\u01c8\7:\2\2\u01c5\u01c6\7\b\2\2"+
"\u01c6\u01c7\7l\2\2\u01c7\u01c9\7\t\2\2\u01c8\u01c5\3\2\2\2\u01c8\u01c9"+
"\3\2\2\2\u01c9\u01d7\3\2\2\2\u01ca\u01cb\7+\2\2\u01cb\u01cc\7\b\2\2\u01cc"+
"\u01d1\7c\2\2\u01cd\u01ce\7\f\2\2\u01ce\u01d0\7c\2\2\u01cf\u01cd\3\2\2"+
"\2\u01d0\u01d3\3\2\2\2\u01d1\u01cf\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d4"+
"\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d4\u01d7\7\t\2\2\u01d5\u01d7\7B\2\2\u01d6"+
"\u01ac\3\2\2\2\u01d6\u01ad\3\2\2\2\u01d6\u01b1\3\2\2\2\u01d6\u01b7\3\2"+
"\2\2\u01d6\u01b8\3\2\2\2\u01d6\u01b9\3\2\2\2\u01d6\u01bd\3\2\2\2\u01d6"+
"\u01be\3\2\2\2\u01d6\u01bf\3\2\2\2\u01d6\u01c0\3\2\2\2\u01d6\u01c1\3\2"+
"\2\2\u01d6\u01c2\3\2\2\2\u01d6\u01c3\3\2\2\2\u01d6\u01c4\3\2\2\2\u01d6"+
"\u01ca\3\2\2\2\u01d6\u01d5\3\2\2\2\u01d7\67\3\2\2\2\u01d8\u01da\5:\36"+
"\2\u01d9\u01d8\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01d9\3\2\2\2\u01db\u01dc"+
"\3\2\2\2\u01dc9\3\2\2\2\u01dd\u01de\5\16\b\2\u01de\u01df\7\n\2\2\u01df"+
"\u0232\3\2\2\2\u01e0\u01e2\7\4\2\2\u01e1\u01e3\58\35\2\u01e2\u01e1\3\2"+
"\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4\u0232\7\5\2\2\u01e5"+
"\u01e6\5D#\2\u01e6\u01e7\7\n\2\2\u01e7\u0232\3\2\2\2\u01e8\u01e9\7D\2"+
"\2\u01e9\u01ea\7\b\2\2\u01ea\u01eb\5D#\2\u01eb\u01ec\7\t\2\2\u01ec\u01ef"+
"\5:\36\2\u01ed\u01ee\7E\2\2\u01ee\u01f0\5:\36\2\u01ef\u01ed\3\2\2\2\u01ef"+
"\u01f0\3\2\2\2\u01f0\u0232\3\2\2\2\u01f1\u01f3\5\66\34\2\u01f2\u01f1\3"+
"\2\2\2\u01f3\u01f6\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4\u01f5\3\2\2\2\u01f5"+
"\u01f7\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f7\u01f8\7F\2\2\u01f8\u01f9\7\b"+
"\2\2\u01f9\u01fa\5D#\2\u01fa\u01fb\7\t\2\2\u01fb\u01fc\5:\36\2\u01fc\u0232"+
"\3\2\2\2\u01fd\u01ff\5\66\34\2\u01fe\u01fd\3\2\2\2\u01ff\u0202\3\2\2\2"+
"\u0200\u01fe\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u0203\3\2\2\2\u0202\u0200"+
"\3\2\2\2\u0203\u0204\7G\2\2\u0204\u0205\5:\36\2\u0205\u0206\7F\2\2\u0206"+
"\u0207\7\b\2\2\u0207\u0208\5D#\2\u0208\u0209\7\t\2\2\u0209\u020a\7\n\2"+
"\2\u020a\u0232\3\2\2\2\u020b\u020d\5\66\34\2\u020c\u020b\3\2\2\2\u020d"+
"\u0210\3\2\2\2\u020e\u020c\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0211\3\2"+
"\2\2\u0210\u020e\3\2\2\2\u0211\u0212\7H\2\2\u0212\u0213\7\b\2\2\u0213"+
"\u0214\5@!\2\u0214\u0215\7\t\2\2\u0215\u0216\5:\36\2\u0216\u0232\3\2\2"+
"\2\u0217\u0218\7I\2\2\u0218\u0219\7\b\2\2\u0219\u021a\5D#\2\u021a\u021b"+
"\7\t\2\2\u021b\u021c\7\4\2\2\u021c\u021d\5<\37\2\u021d\u021e\7\5\2\2\u021e"+
"\u0232\3\2\2\2\u021f\u0221\7J\2\2\u0220\u0222\5D#\2\u0221\u0220\3\2\2"+
"\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0232\7\n\2\2\u0224\u0225"+
"\7K\2\2\u0225\u0232\7\n\2\2\u0226\u0227\7L\2\2\u0227\u0232\7\n\2\2\u0228"+
"\u022a\7M\2\2\u0229\u022b\5L\'\2\u022a\u0229\3\2\2\2\u022a\u022b\3\2\2"+
"\2\u022b\u022c\3\2\2\2\u022c\u022d\7\4\2\2\u022d\u022e\5P)\2\u022e\u022f"+
"\7\u0083\2\2\u022f\u0232\3\2\2\2\u0230\u0232\5J&\2\u0231\u01dd\3\2\2\2"+
"\u0231\u01e0\3\2\2\2\u0231\u01e5\3\2\2\2\u0231\u01e8\3\2\2\2\u0231\u01f4"+
"\3\2\2\2\u0231\u0200\3\2\2\2\u0231\u020e\3\2\2\2\u0231\u0217\3\2\2\2\u0231"+
"\u021f\3\2\2\2\u0231\u0224\3\2\2\2\u0231\u0226\3\2\2\2\u0231\u0228\3\2"+
"\2\2\u0231\u0230\3\2\2\2\u0232;\3\2\2\2\u0233\u0235\5> \2\u0234\u0233"+
"\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0234\3\2\2\2\u0236\u0237\3\2\2\2\u0237"+
"\u023d\3\2\2\2\u0238\u0239\7N\2\2\u0239\u023b\7\13\2\2\u023a\u023c\58"+
"\35\2\u023b\u023a\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023e\3\2\2\2\u023d"+
"\u0238\3\2\2\2\u023d\u023e\3\2\2\2\u023e=\3\2\2\2\u023f\u0240\7O\2\2\u0240"+
"\u0241\5F$\2\u0241\u0243\7\13\2\2\u0242\u0244\58\35\2\u0243\u0242\3\2"+
"\2\2\u0243\u0244\3\2\2\2\u0244?\3\2\2\2\u0245\u0246\5B\"\2\u0246\u0247"+
"\7\n\2\2\u0247\u0248\5D#\2\u0248\u024a\7\n\2\2\u0249\u024b\5D#\2\u024a"+
"\u0249\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u025c\3\2\2\2\u024c\u0250\5\26"+
"\f\2\u024d\u024f\5\30\r\2\u024e\u024d\3\2\2\2\u024f\u0252\3\2\2\2\u0250"+
"\u024e\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0254\3\2\2\2\u0252\u0250\3\2"+
"\2\2\u0253\u024c\3\2\2\2\u0253\u0254\3\2\2\2\u0254\u0255\3\2\2\2\u0255"+
"\u0256\7l\2\2\u0256\u0257\7\13\2\2\u0257\u0258\5F$\2\u0258\u0259\7\r\2"+
"\2\u0259\u025a\5F$\2\u025a\u025c\3\2\2\2\u025b\u0245\3\2\2\2\u025b\u0253"+
"\3\2\2\2\u025cA\3\2\2\2\u025d\u025f\5\16\b\2\u025e\u025d\3\2\2\2\u025e"+
"\u025f\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u0262\5D#\2\u0261\u025e\3\2\2"+
"\2\u0261\u0260\3\2\2\2\u0262C\3\2\2\2\u0263\u0264\b#\1\2\u0264\u0265\5"+
"F$\2\u0265\u026b\3\2\2\2\u0266\u0267\f\3\2\2\u0267\u0268\7\f\2\2\u0268"+
"\u026a\5F$\2\u0269\u0266\3\2\2\2\u026a\u026d\3\2\2\2\u026b\u0269\3\2\2"+
"\2\u026b\u026c\3\2\2\2\u026cE\3\2\2\2\u026d\u026b\3\2\2\2\u026e\u026f"+
"\b$\1\2\u026f\u0270\7\b\2\2\u0270\u0271\5D#\2\u0271\u0272\7\t\2\2\u0272"+
"\u02a5\3\2\2\2\u0273\u0274\7R\2\2\u0274\u0277\7\b\2\2\u0275\u0278\5F$"+
"\2\u0276\u0278\5\34\17\2\u0277\u0275\3\2\2\2\u0277\u0276\3\2\2\2\u0278"+
"\u0279\3\2\2\2\u0279\u027a\7\t\2\2\u027a\u02a5\3\2\2\2\u027b\u027c\7S"+
"\2\2\u027c\u027f\7\b\2\2\u027d\u0280\5F$\2\u027e\u0280\5\34\17\2\u027f"+
"\u027d\3\2\2\2\u027f\u027e\3\2\2\2\u0280\u0281\3\2\2\2\u0281\u0282\7\t"+
"\2\2\u0282\u02a5\3\2\2\2\u0283\u0284\7\b\2\2\u0284\u0285\5\34\17\2\u0285"+
"\u0286\7\t\2\2\u0286\u0287\5F$\32\u0287\u02a5\3\2\2\2\u0288\u0289\t\2"+
"\2\2\u0289\u02a5\5F$\31\u028a\u028b\7\23\2\2\u028b\u02a5\5F$\27\u028c"+
"\u028d\t\3\2\2\u028d\u02a5\5F$\26\u028e\u028f\t\4\2\2\u028f\u02a5\5F$"+
"\22\u0290\u0291\7\4\2\2\u0291\u0296\5F$\2\u0292\u0293\7\f\2\2\u0293\u0295"+
"\5F$\2\u0294\u0292\3\2\2\2\u0295\u0298\3\2\2\2\u0296\u0294\3\2\2\2\u0296"+
"\u0297\3\2\2\2\u0297\u0299\3\2\2\2\u0298\u0296\3\2\2\2\u0299\u029a\7\5"+
"\2\2\u029a\u02a5\3\2\2\2\u029b\u02a5\7l\2\2\u029c\u02a5\7c\2\2\u029d\u029f"+
"\7_\2\2\u029e\u029d\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0\u029e\3\2\2\2\u02a0"+
"\u02a1\3\2\2\2\u02a1\u02a5\3\2\2\2\u02a2\u02a5\7`\2\2\u02a3\u02a5\7]\2"+
"\2\u02a4\u026e\3\2\2\2\u02a4\u0273\3\2\2\2\u02a4\u027b\3\2\2\2\u02a4\u0283"+
"\3\2\2\2\u02a4\u0288\3\2\2\2\u02a4\u028a\3\2\2\2\u02a4\u028c\3\2\2\2\u02a4"+
"\u028e\3\2\2\2\u02a4\u0290\3\2\2\2\u02a4\u029b\3\2\2\2\u02a4\u029c\3\2"+
"\2\2\u02a4\u029e\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a4\u02a3\3\2\2\2\u02a5"+
"\u02e2\3\2\2\2\u02a6\u02a7\f\25\2\2\u02a7\u02a8\t\5\2\2\u02a8\u02e1\5"+
"F$\26\u02a9\u02aa\f\24\2\2\u02aa\u02ab\t\6\2\2\u02ab\u02e1\5F$\25\u02ac"+
"\u02ad\f\23\2\2\u02ad\u02ae\t\7\2\2\u02ae\u02e1\5F$\24\u02af\u02b0\f\21"+
"\2\2\u02b0\u02b1\t\b\2\2\u02b1\u02e1\5F$\22\u02b2\u02b3\f\20\2\2\u02b3"+
"\u02b4\7\30\2\2\u02b4\u02e1\5F$\21\u02b5\u02b6\f\17\2\2\u02b6\u02b7\7"+
"\32\2\2\u02b7\u02e1\5F$\20\u02b8\u02b9\f\16\2\2\u02b9\u02ba\7\33\2\2\u02ba"+
"\u02e1\5F$\17\u02bb\u02bc\f\r\2\2\u02bc\u02bd\7$\2\2\u02bd\u02e1\5F$\16"+
"\u02be\u02bf\f\f\2\2\u02bf\u02c0\7%\2\2\u02c0\u02e1\5F$\r\u02c1\u02c2"+
"\f\13\2\2\u02c2\u02c3\7\16\2\2\u02c3\u02c4\5F$\2\u02c4\u02c5\7\13\2\2"+
"\u02c5\u02c6\5F$\f\u02c6\u02e1\3\2\2\2\u02c7\u02c8\f\n\2\2\u02c8\u02c9"+
"\7&\2\2\u02c9\u02e1\5F$\n\u02ca\u02cb\f\t\2\2\u02cb\u02cc\7\'\2\2\u02cc"+
"\u02e1\5F$\t\u02cd\u02ce\f \2\2\u02ce\u02cf\7\17\2\2\u02cf\u02e1\7l\2"+
"\2\u02d0\u02d1\f\37\2\2\u02d1\u02d2\7\20\2\2\u02d2\u02e1\7l\2\2\u02d3"+
"\u02d4\f\36\2\2\u02d4\u02d6\7\b\2\2\u02d5\u02d7\5H%\2\u02d6\u02d5\3\2"+
"\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02e1\7\t\2\2\u02d9"+
"\u02da\f\33\2\2\u02da\u02db\7\6\2\2\u02db\u02dc\5D#\2\u02dc\u02dd\7\7"+
"\2\2\u02dd\u02e1\3\2\2\2\u02de\u02df\f\30\2\2\u02df\u02e1\t\2\2\2\u02e0"+
"\u02a6\3\2\2\2\u02e0\u02a9\3\2\2\2\u02e0\u02ac\3\2\2\2\u02e0\u02af\3\2"+
"\2\2\u02e0\u02b2\3\2\2\2\u02e0\u02b5\3\2\2\2\u02e0\u02b8\3\2\2\2\u02e0"+
"\u02bb\3\2\2\2\u02e0\u02be\3\2\2\2\u02e0\u02c1\3\2\2\2\u02e0\u02c7\3\2"+
"\2\2\u02e0\u02ca\3\2\2\2\u02e0\u02cd\3\2\2\2\u02e0\u02d0\3\2\2\2\u02e0"+
"\u02d3\3\2\2\2\u02e0\u02d9\3\2\2\2\u02e0\u02de\3\2\2\2\u02e1\u02e4\3\2"+
"\2\2\u02e2\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3G\3\2\2\2\u02e4\u02e2"+
"\3\2\2\2\u02e5\u02ea\5F$\2\u02e6\u02e7\7\f\2\2\u02e7\u02e9\5F$\2\u02e8"+
"\u02e6\3\2\2\2\u02e9\u02ec\3\2\2\2\u02ea\u02e8\3\2\2\2\u02ea\u02eb\3\2"+
"\2\2\u02ebI\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ed\u02ef\7T\2\2\u02ee\u02f0"+
"\5L\'\2\u02ef\u02ee\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+
"\u02f2\7^\2\2\u02f2K\3\2\2\2\u02f3\u02f4\7\b\2\2\u02f4\u02f9\5N(\2\u02f5"+
"\u02f6\7\f\2\2\u02f6\u02f8\5N(\2\u02f7\u02f5\3\2\2\2\u02f8\u02fb\3\2\2"+
"\2\u02f9\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\3\2\2\2\u02fb\u02f9"+
"\3\2\2\2\u02fc\u02fd\7\t\2\2\u02fdM\3\2\2\2\u02fe\u02ff\7U\2\2\u02ff\u030e"+
"\7_\2\2\u0300\u0301\7V\2\2\u0301\u030e\7l\2\2\u0302\u0303\7W\2\2\u0303"+
"\u030e\7_\2\2\u0304\u0305\7X\2\2\u0305\u030e\5F$\2\u0306\u0307\7Y\2\2"+
"\u0307\u030e\5F$\2\u0308\u030b\7,\2\2\u0309\u030c\7\67\2\2\u030a\u030c"+
"\5F$\2\u030b\u0309\3\2\2\2\u030b\u030a\3\2\2\2\u030c\u030e\3\2\2\2\u030d"+
"\u02fe\3\2\2\2\u030d\u0300\3\2\2\2\u030d\u0302\3\2\2\2\u030d\u0304\3\2"+
"\2\2\u030d\u0306\3\2\2\2\u030d\u0308\3\2\2\2\u030eO\3\2\2\2\u030f\u0311"+
"\5R*\2\u0310\u030f\3\2\2\2\u0311\u0314\3\2\2\2\u0312\u0310\3\2\2\2\u0312"+
"\u0313\3\2\2\2\u0313Q\3\2\2\2\u0314\u0312\3\2\2\2\u0315\u0319\5T+\2\u0316"+
"\u0319\5V,\2\u0317\u0319\5X-\2\u0318\u0315\3\2\2\2\u0318\u0316\3\2\2\2"+
"\u0318\u0317\3\2\2\2\u0319S\3\2\2\2\u031a\u031b\7\u0090\2\2\u031b\u031f"+
"\7s\2\2\u031c\u031d\7\u008f\2\2\u031d\u031f\7s\2\2\u031e\u031a\3\2\2\2"+
"\u031e\u031c\3\2\2\2\u031fU\3\2\2\2\u0320\u0322\7q\2\2\u0321\u0323\5Z"+
".\2\u0322\u0321\3\2\2\2\u0322\u0323\3\2\2\2\u0323W\3\2\2\2\u0324\u0325"+
"\7p\2\2\u0325\u032a\5\\/\2\u0326\u0327\7t\2\2\u0327\u0329\5\\/\2\u0328"+
"\u0326\3\2\2\2\u0329\u032c\3\2\2\2\u032a\u0328\3\2\2\2\u032a\u032b\3\2"+
"\2\2\u032bY\3\2\2\2\u032c\u032a\3\2\2\2\u032d\u0345\5\\/\2\u032e\u032f"+
"\7r\2\2\u032f\u0345\5\\/\2\u0330\u0331\5\\/\2\u0331\u0332\7t\2\2\u0332"+
"\u0333\7\u0090\2\2\u0333\u0345\3\2\2\2\u0334\u0335\7u\2\2\u0335\u0336"+
"\5\\/\2\u0336\u0337\7v\2\2\u0337\u0338\7t\2\2\u0338\u0339\7\u0090\2\2"+
"\u0339\u0345\3\2\2\2\u033a\u033b\7u\2\2\u033b\u033c\5\\/\2\u033c\u033d"+
"\7t\2\2\u033d\u033e\7\u0090\2\2\u033e\u033f\7v\2\2\u033f\u0345\3\2\2\2"+
"\u0340\u0341\7u\2\2\u0341\u0342\5\\/\2\u0342\u0343\7v\2\2\u0343\u0345"+
"\3\2\2\2\u0344\u032d\3\2\2\2\u0344\u032e\3\2\2\2\u0344\u0330\3\2\2\2\u0344"+
"\u0334\3\2\2\2\u0344\u033a\3\2\2\2\u0344\u0340\3\2\2\2\u0345[\3\2\2\2"+
"\u0346\u0347\b/\1\2\u0347\u0348\7w\2\2\u0348\u0349\5\\/\2\u0349\u034a"+
"\7x\2\2\u034a\u0355\3\2\2\2\u034b\u034c\t\t\2\2\u034c\u0355\5\\/\n\u034d"+
"\u0355\7\u0090\2\2\u034e\u0355\7\u008e\2\2\u034f\u0350\7\u0082\2\2\u0350"+
"\u0351\7\u0090\2\2\u0351\u0355\7\u0083\2\2\u0352\u0355\7\u0084\2\2\u0353"+
"\u0355\7\u008d\2\2\u0354\u0346\3\2\2\2\u0354\u034b\3\2\2\2\u0354\u034d"+
"\3\2\2\2\u0354\u034e\3\2\2\2\u0354\u034f\3\2\2\2\u0354\u0352\3\2\2\2\u0354"+
"\u0353\3\2\2\2\u0355\u0364\3\2\2\2\u0356\u0357\f\f\2\2\u0357\u0358\7y"+
"\2\2\u0358\u0363\5\\/\r\u0359\u035a\f\13\2\2\u035a\u035b\t\n\2\2\u035b"+
"\u0363\5\\/\f\u035c\u035d\f\t\2\2\u035d\u035e\t\13\2\2\u035e\u0363\5\\"+
"/\n\u035f\u0360\f\b\2\2\u0360\u0361\t\f\2\2\u0361\u0363\5\\/\t\u0362\u0356"+
"\3\2\2\2\u0362\u0359\3\2\2\2\u0362\u035c\3\2\2\2\u0362\u035f\3\2\2\2\u0363"+
"\u0366\3\2\2\2\u0364\u0362\3\2\2\2\u0364\u0365\3\2\2\2\u0365]\3\2\2\2"+
"\u0366\u0364\3\2\2\2Vgl\u0080\u0089\u0093\u0099\u00a1\u00a8\u00b1\u00b6"+
"\u00bc\u00c1\u00c6\u00cd\u00d4\u00d9\u00e5\u00e8\u00ea\u00f5\u00fc\u0101"+
"\u0107\u0109\u0111\u0117\u0123\u0131\u0137\u013d\u0143\u0148\u0151\u0158"+
"\u015e\u0169\u01a6\u01aa\u01b5\u01c8\u01d1\u01d6\u01db\u01e2\u01ef\u01f4"+
"\u0200\u020e\u0221\u022a\u0231\u0236\u023b\u023d\u0243\u024a\u0250\u0253"+
"\u025b\u025e\u0261\u026b\u0277\u027f\u0296\u02a0\u02a4\u02d6\u02e0\u02e2"+
"\u02ea\u02ef\u02f9\u030b\u030d\u0312\u0318\u031e\u0322\u032a\u0344\u0354"+
"\u0362\u0364";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -92,55 +92,57 @@ BOOLEAN=91
KICKASM_BODY=92
STRING=93
CHAR=94
NUMBER=95
NUMFLOAT=96
BINFLOAT=97
DECFLOAT=98
HEXFLOAT=99
NUMINT=100
BININTEGER=101
DECINTEGER=102
HEXINTEGER=103
NAME=104
WS=105
COMMENT_LINE=106
COMMENT_BLOCK=107
ASM_BYTE=108
ASM_MNEMONIC=109
ASM_IMM=110
ASM_COLON=111
ASM_COMMA=112
ASM_PAR_BEGIN=113
ASM_PAR_END=114
ASM_BRACKET_BEGIN=115
ASM_BRACKET_END=116
ASM_DOT=117
ASM_SHIFT_LEFT=118
ASM_SHIFT_RIGHT=119
ASM_PLUS=120
ASM_MINUS=121
ASM_LESS_THAN=122
ASM_GREATER_THAN=123
ASM_MULTIPLY=124
ASM_DIVIDE=125
ASM_CURLY_BEGIN=126
ASM_CURLY_END=127
ASM_NUMBER=128
ASM_NUMFLOAT=129
ASM_BINFLOAT=130
ASM_DECFLOAT=131
ASM_HEXFLOAT=132
ASM_NUMINT=133
ASM_BININTEGER=134
ASM_DECINTEGER=135
ASM_HEXINTEGER=136
ASM_CHAR=137
ASM_MULTI_REL=138
ASM_MULTI_NAME=139
ASM_NAME=140
ASM_WS=141
ASM_COMMENT_LINE=142
ASM_COMMENT_BLOCK=143
DEFINE=95
DEFINE_CONTINUE=96
NUMBER=97
NUMFLOAT=98
BINFLOAT=99
DECFLOAT=100
HEXFLOAT=101
NUMINT=102
BININTEGER=103
DECINTEGER=104
HEXINTEGER=105
NAME=106
WS=107
COMMENT_LINE=108
COMMENT_BLOCK=109
ASM_BYTE=110
ASM_MNEMONIC=111
ASM_IMM=112
ASM_COLON=113
ASM_COMMA=114
ASM_PAR_BEGIN=115
ASM_PAR_END=116
ASM_BRACKET_BEGIN=117
ASM_BRACKET_END=118
ASM_DOT=119
ASM_SHIFT_LEFT=120
ASM_SHIFT_RIGHT=121
ASM_PLUS=122
ASM_MINUS=123
ASM_LESS_THAN=124
ASM_GREATER_THAN=125
ASM_MULTIPLY=126
ASM_DIVIDE=127
ASM_CURLY_BEGIN=128
ASM_CURLY_END=129
ASM_NUMBER=130
ASM_NUMFLOAT=131
ASM_BINFLOAT=132
ASM_DECFLOAT=133
ASM_HEXFLOAT=134
ASM_NUMINT=135
ASM_BININTEGER=136
ASM_DECINTEGER=137
ASM_HEXINTEGER=138
ASM_CHAR=139
ASM_MULTI_REL=140
ASM_MULTI_NAME=141
ASM_NAME=142
ASM_WS=143
ASM_COMMENT_LINE=144
ASM_COMMENT_BLOCK=145
';'=8
'..'=11
'?'=12
@ -209,5 +211,7 @@ ASM_COMMENT_BLOCK=143
'bytes'=86
'cycles'=87
'!'=88
'.byte'=108
'#'=110
'#define'=95
'\\\n'=96
'.byte'=110
'#'=112

View File

@ -2359,11 +2359,6 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
throw new CompileError("Error! Unhandled symbol " + symbol.toString(program));
}
/** The hidden lexer channel containing whitespace. */
private static final int CHANNEL_WHITESPACE = 1;
/** The hidden lexer channel containing comments. */
private static final int CHANNEL_COMMENTS = 2;
/**
* Find all comments preceding the passed context.
* Group the comments into blocks each time an empty line (double newline) is encountered
@ -2378,7 +2373,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
List<Token> hiddenTokens = tokenStream.getHiddenTokensToLeft(ctx.start.getTokenIndex());
if(hiddenTokens != null) {
for(Token hiddenToken : hiddenTokens) {
if(hiddenToken.getChannel() == CHANNEL_WHITESPACE) {
if(hiddenToken.getChannel() == CParser.CHANNEL_WHITESPACE) {
String text = hiddenToken.getText();
long newlineCount = text.chars().filter(ch -> ch == '\n').count();
if(newlineCount > 1 && comments.size() > 0) {
@ -2386,7 +2381,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
commentBlocks.add(comments);
comments = new ArrayList<>();
}
} else if(hiddenToken.getChannel() == CHANNEL_COMMENTS) {
} else if(hiddenToken.getChannel() == CParser.CHANNEL_COMMENTS) {
boolean isBlock = false;
String text = hiddenToken.getText();
if(text.startsWith("//")) {