PY-31442 Handle hash signs in literal parts of f-strings

Made the corresponding states of the lexer exclusive so that the pattern
for line comments doesn't match literal fragments starting with a hash sign
as the longest (together with closing braces and quotes). It also means that
we need to replicate the BAD_CHARACTER rule in these states as a fallback
pattern for unmatched input.
This commit is contained in:
Mikhail Golubev
2018-10-01 12:46:45 +03:00
parent 1e527a9ba4
commit 2e8b9f7a9f
12 changed files with 492 additions and 415 deletions
@@ -189,32 +189,32 @@ class _PythonLexer implements FlexLexerEx {
"\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+
"\1\25\20\3\1\26\1\27\1\30\1\31\1\32\1\33"+
"\1\34\1\35\1\36\1\37\1\40\1\41\1\42\2\43"+
"\1\44\2\45\1\46\1\3\2\47\1\22\3\3\2\50"+
"\1\51\1\10\1\51\1\52\1\53\1\3\2\54\1\55"+
"\1\44\2\45\1\46\1\3\2\47\1\22\3\3\1\50"+
"\1\51\1\1\1\51\1\52\1\53\1\3\2\54\1\55"+
"\1\56\1\57\1\60\1\61\1\62\1\63\1\64\1\65"+
"\3\3\2\50\1\10\1\52\1\66\1\2\5\0\1\2"+
"\3\3\1\50\1\1\1\52\1\66\1\2\5\0\1\2"+
"\1\67\1\0\1\70\1\0\1\3\1\67\1\71\1\72"+
"\3\7\1\73\3\7\1\3\2\74\1\75\1\76\15\3"+
"\1\77\1\100\1\101\1\102\10\3\1\103\1\104\1\105"+
"\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+
"\1\116\1\117\1\120\1\121\1\0\3\45\1\122\3\45"+
"\1\3\6\47\2\0\1\123\1\3\2\0\2\44\1\51"+
"\1\124\1\50\1\51\1\3\7\54\1\57\1\3\1\0"+
"\1\44\1\50\1\0\1\2\1\0\1\2\1\0\1\2"+
"\1\0\1\67\1\0\1\3\1\0\1\7\1\125\1\126"+
"\1\0\1\125\1\3\2\0\1\127\1\3\1\130\1\131"+
"\1\132\5\3\1\133\6\3\1\134\5\3\1\135\1\136"+
"\1\137\1\140\1\0\1\45\1\141\1\142\1\0\1\141"+
"\1\3\1\47\2\143\1\50\1\51\1\3\2\54\1\144"+
"\2\50\1\0\2\145\1\0\1\3\1\74\1\3\1\146"+
"\1\147\10\3\1\150\1\3\1\151\3\3\1\0\2\142"+
"\7\0\1\50\4\0\2\3\1\152\1\3\1\153\1\154"+
"\4\3\1\155\1\3\1\156\7\0\1\125\1\157\1\160"+
"\1\161\1\3\1\162\1\163\1\3\1\164\1\141\1\143"+
"\1\144\1\145\1\0\1\165\1\3\1\166\1\167";
"\1\3\6\47\2\0\1\123\1\3\2\0\1\51\1\124"+
"\1\50\1\51\1\3\7\54\1\57\1\3\1\0\1\50"+
"\1\0\1\2\1\0\1\2\1\0\1\2\1\0\1\67"+
"\1\0\1\3\1\0\1\7\1\125\1\126\1\0\1\125"+
"\1\3\2\0\1\127\1\3\1\130\1\131\1\132\5\3"+
"\1\133\6\3\1\134\5\3\1\135\1\136\1\137\1\140"+
"\1\0\1\45\1\141\1\142\1\0\1\141\1\3\1\47"+
"\2\143\1\51\1\3\2\54\1\144\1\50\1\0\2\145"+
"\1\0\1\3\1\74\1\3\1\146\1\147\10\3\1\150"+
"\1\3\1\151\3\3\1\0\2\142\13\0\2\3\1\152"+
"\1\3\1\153\1\154\4\3\1\155\1\3\1\156\7\0"+
"\1\125\1\157\1\160\1\161\1\3\1\162\1\163\1\3"+
"\1\164\1\141\1\143\1\144\1\145\1\0\1\165\1\3"+
"\1\166\1\167";
private static int [] zzUnpackAction() {
int [] result = new int[348];
int [] result = new int[340];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -248,44 +248,43 @@ class _PythonLexer implements FlexLexerEx {
"\0\u0a64\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0\0\u0c2c\0\u0c78"+
"\0\u0cc4\0\u0d10\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0d5c\0\u0da8"+
"\0\u0df4\0\u0e40\0\u01c8\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70\0\u0fbc"+
"\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u121c"+
"\0\u01c8\0\u1268\0\u12b4\0\u1300\0\u01c8\0\u01c8\0\u134c\0\u01c8"+
"\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u1398\0\u13e4\0\u1430"+
"\0\u147c\0\u14c8\0\u1514\0\u01c8\0\u01c8\0\u1560\0\u15ac\0\u15f8"+
"\0\u1644\0\u1690\0\u16dc\0\u01c8\0\u1728\0\u1774\0\u01c8\0\u17c0"+
"\0\u180c\0\u1858\0\u01c8\0\u01c8\0\u18a4\0\u18f0\0\u193c\0\u01c8"+
"\0\u1988\0\u19d4\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u01c8\0\u01c8"+
"\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u01c8"+
"\0\u121c\0\u1268\0\u12b4\0\u01c8\0\u01c8\0\u1300\0\u01c8\0\u01c8"+
"\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u134c\0\u1398\0\u13e4\0\u1430"+
"\0\u147c\0\u01c8\0\u01c8\0\u14c8\0\u1514\0\u1560\0\u15ac\0\u15f8"+
"\0\u1644\0\u01c8\0\u1690\0\u16dc\0\u01c8\0\u1728\0\u1774\0\u17c0"+
"\0\u01c8\0\u01c8\0\u180c\0\u1858\0\u18a4\0\u01c8\0\u18f0\0\u193c"+
"\0\u1988\0\u19d4\0\u1a20\0\u1a6c\0\u01c8\0\u01c8\0\u1ab8\0\u1b04"+
"\0\u1b50\0\u1b9c\0\u1be8\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64"+
"\0\u1db0\0\u1dfc\0\u1e48\0\u1e94\0\u1ee0\0\u02ac\0\u02ac\0\u02ac"+
"\0\u02ac\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+
"\0\u2140\0\u01c8\0\u01c8\0\u218c\0\u01c8\0\u01c8\0\u21d8\0\u01c8"+
"\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u2224\0\u01c8\0\u01c8\0\u2270"+
"\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u01c8\0\u23ec\0\u2438\0\u2484"+
"\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4"+
"\0\u0f70\0\u01c8\0\u2730\0\u277c\0\u121c\0\u27c8\0\u2814\0\u2860"+
"\0\u01c8\0\u28ac\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2568\0\u2a28"+
"\0\u1db0\0\u1dfc\0\u1e48\0\u02ac\0\u02ac\0\u02ac\0\u02ac\0\u1e94"+
"\0\u1ee0\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u01c8"+
"\0\u01c8\0\u20f4\0\u01c8\0\u01c8\0\u2140\0\u01c8\0\u01c8\0\u01c8"+
"\0\u01c8\0\u01c8\0\u218c\0\u01c8\0\u01c8\0\u21d8\0\u2224\0\u2270"+
"\0\u22bc\0\u2308\0\u01c8\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u2484"+
"\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u0f70\0\u01c8"+
"\0\u2698\0\u26e4\0\u11d0\0\u2730\0\u01c8\0\u277c\0\u27c8\0\u2814"+
"\0\u2860\0\u28ac\0\u24d0\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2a28"+
"\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u2c88"+
"\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u2e9c\0\u2ee8"+
"\0\u2f34\0\u2f80\0\u0390\0\u2fcc\0\u3018\0\u01c8\0\u2fcc\0\u3064"+
"\0\u30b0\0\u30fc\0\u3148\0\u02ac\0\u3194\0\u02ac\0\u02ac\0\u02ac"+
"\0\u31e0\0\u322c\0\u3278\0\u32c4\0\u3310\0\u02ac\0\u335c\0\u33a8"+
"\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u02ac\0\u3524\0\u3570\0\u35bc"+
"\0\u3608\0\u3654\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u36a0\0\u36ec"+
"\0\u3738\0\u01c8\0\u36ec\0\u3784\0\u37d0\0\u01c8\0\u381c\0\u3868"+
"\0\u38b4\0\u01c8\0\u3900\0\u2698\0\u01c8\0\u394c\0\u3998\0\u39e4"+
"\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u01c8\0\u3bac\0\u02ac"+
"\0\u02ac\0\u3bf8\0\u3c44\0\u3c90\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0"+
"\0\u3e0c\0\u02ac\0\u3e58\0\u02ac\0\u3ea4\0\u3ef0\0\u3f3c\0\u3f88"+
"\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150\0\u419c\0\u41e8"+
"\0\u4234\0\u4280\0\u42cc\0\u3a7c\0\u3ac8\0\u4318\0\u4364\0\u43b0"+
"\0\u02ac\0\u43fc\0\u02ac\0\u02ac\0\u4448\0\u4494\0\u44e0\0\u452c"+
"\0\u02ac\0\u4578\0\u02ac\0\u45c4\0\u3fd4\0\u4020\0\u4610\0\u465c"+
"\0\u46a8\0\u46f4\0\u4740\0\u02ac\0\u02ac\0\u02ac\0\u478c\0\u02ac"+
"\0\u02ac\0\u47d8\0\u02ac\0\u36ec\0\u01c8\0\u01c8\0\u01c8\0\u4740"+
"\0\u01c8\0\u4824\0\u02ac\0\u02ac";
"\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u0390\0\u2e50\0\u2e9c"+
"\0\u01c8\0\u2e50\0\u2ee8\0\u2f34\0\u2f80\0\u2fcc\0\u02ac\0\u3018"+
"\0\u02ac\0\u02ac\0\u02ac\0\u3064\0\u30b0\0\u30fc\0\u3148\0\u3194"+
"\0\u02ac\0\u31e0\0\u322c\0\u3278\0\u32c4\0\u3310\0\u335c\0\u02ac"+
"\0\u33a8\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u01c8\0\u01c8\0\u01c8"+
"\0\u01c8\0\u3524\0\u3570\0\u35bc\0\u01c8\0\u3570\0\u3608\0\u3654"+
"\0\u01c8\0\u36a0\0\u36ec\0\u01c8\0\u3738\0\u2600\0\u01c8\0\u3784"+
"\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u3900\0\u394c\0\u01c8\0\u3998"+
"\0\u02ac\0\u02ac\0\u39e4\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60"+
"\0\u3bac\0\u3bf8\0\u02ac\0\u3c44\0\u02ac\0\u3c90\0\u3cdc\0\u3d28"+
"\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c\0\u3f88"+
"\0\u3fd4\0\u4020\0\u406c\0\u3868\0\u38b4\0\u40b8\0\u4104\0\u4150"+
"\0\u02ac\0\u419c\0\u02ac\0\u02ac\0\u41e8\0\u4234\0\u4280\0\u42cc"+
"\0\u02ac\0\u4318\0\u02ac\0\u4364\0\u3dc0\0\u3e0c\0\u43b0\0\u43fc"+
"\0\u4448\0\u4494\0\u44e0\0\u02ac\0\u02ac\0\u02ac\0\u452c\0\u02ac"+
"\0\u02ac\0\u4578\0\u02ac\0\u3570\0\u01c8\0\u01c8\0\u01c8\0\u44e0"+
"\0\u01c8\0\u45c4\0\u02ac\0\u02ac";
private static int [] zzUnpackRowMap() {
int [] result = new int[348];
int [] result = new int[340];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -329,372 +328,361 @@ class _PythonLexer implements FlexLexerEx {
"\1\112\1\51\1\52\1\53\1\104\1\54\1\12\1\55"+
"\1\56\1\12\1\57\1\60\1\12\1\61\1\62\1\63"+
"\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73"+
"\1\74\1\75\1\7\13\113\1\114\1\0\10\113\1\115"+
"\1\116\1\117\1\113\1\120\5\113\1\121\54\113\1\7"+
"\1\10\2\11\1\12\1\11\3\12\1\122\1\12\1\100"+
"\1\7\1\12\1\7\1\15\1\12\1\16\1\12\2\122"+
"\1\123\1\20\1\124\1\22\1\125\1\126\1\12\1\25"+
"\1\127\1\27\1\130\1\131\1\132\1\133\1\134\1\135"+
"\1\36\1\37\1\40\1\41\1\42\1\43\1\12\1\44"+
"\1\136\1\46\1\137\1\12\1\140\1\51\1\52\1\53"+
"\1\122\1\54\1\12\1\55\1\56\1\12\1\57\1\60"+
"\1\12\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+
"\1\70\1\71\1\72\1\73\1\74\1\75\1\7\13\141"+
"\1\142\1\0\10\141\1\115\1\143\1\117\1\141\1\144"+
"\1\145\4\141\1\121\54\141\115\0\1\146\1\147\1\146"+
"\1\0\1\146\1\150\1\151\1\152\1\153\1\154\4\0"+
"\1\155\1\156\1\0\1\157\31\0\1\156\2\0\1\153"+
"\2\0\1\154\1\152\3\0\1\150\25\0\3\11\1\0"+
"\1\11\1\0\1\160\2\0\1\154\4\0\1\155\1\156"+
"\1\0\1\157\31\0\1\156\5\0\1\154\32\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\26\12\17\0\10\12\1\161\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+
"\1\0\1\21\1\22\2\0\1\12\14\0\5\12\1\161"+
"\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+
"\16\0\14\14\1\0\22\14\1\0\54\14\1\0\3\162"+
"\1\0\1\162\144\0\1\163\47\0\1\164\5\0\14\165"+
"\1\0\10\165\1\166\1\167\10\165\1\170\54\165\14\171"+
"\1\0\11\171\1\172\1\173\7\171\1\170\54\171\1\0"+
"\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\174\1\175\1\0\1\176\1\12\2\0\1\12"+
"\14\0\5\12\1\174\1\12\1\174\1\12\1\174\3\12"+
"\1\174\10\12\54\0\1\177\113\0\1\200\56\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\1\12\1\201\1\12\1\202\22\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\13\12\1\203\12\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\4\12\1\204\21\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\12\12\1\205\4\12"+
"\1\206\6\12\17\0\10\12\1\161\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+
"\1\22\2\0\1\12\14\0\1\207\3\12\1\210\1\161"+
"\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\5\12\1\211\20\12"+
"\17\0\10\12\1\161\1\12\2\0\2\12\1\0\1\12"+
"\1\0\1\12\2\161\1\17\1\0\1\21\1\22\2\0"+
"\1\12\14\0\5\12\1\212\1\12\1\161\1\12\1\161"+
"\3\12\1\161\1\22\7\12\17\0\10\12\1\161\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+
"\1\0\1\21\1\22\2\0\1\12\14\0\5\12\1\161"+
"\1\12\1\161\1\12\1\161\1\213\1\214\1\12\1\161"+
"\1\22\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\215"+
"\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\216"+
"\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\1\12\1\217"+
"\1\12\1\220\12\12\1\221\3\12\1\222\3\12\17\0"+
"\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\174\1\175\1\0\1\176\1\12\2\0\1\12"+
"\14\0\5\12\1\223\1\12\1\174\1\12\1\174\1\12"+
"\1\224\1\225\1\174\10\12\17\0\12\12\2\0\2\12"+
"\1\74\1\75\1\7\14\113\1\7\10\113\1\114\1\115"+
"\1\116\1\113\1\117\5\113\1\120\54\113\1\7\1\10"+
"\2\11\1\12\1\11\3\12\1\121\1\12\1\100\1\7"+
"\1\12\1\7\1\15\1\12\1\16\1\12\2\121\1\122"+
"\1\20\1\123\1\22\1\124\1\125\1\12\1\25\1\126"+
"\1\27\1\127\1\130\1\131\1\132\1\133\1\134\1\36"+
"\1\37\1\40\1\41\1\42\1\43\1\12\1\44\1\135"+
"\1\46\1\136\1\12\1\137\1\51\1\52\1\53\1\121"+
"\1\54\1\12\1\55\1\56\1\12\1\57\1\60\1\12"+
"\1\61\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+
"\1\71\1\72\1\73\1\74\1\75\1\7\14\140\1\7"+
"\10\140\1\114\1\141\1\116\1\140\1\142\1\143\4\140"+
"\1\120\54\140\115\0\1\144\1\145\1\144\1\0\1\144"+
"\1\146\1\147\1\150\1\151\1\152\4\0\1\153\1\154"+
"\1\0\1\155\31\0\1\154\2\0\1\151\2\0\1\152"+
"\1\150\3\0\1\146\25\0\3\11\1\0\1\11\1\0"+
"\1\156\2\0\1\152\4\0\1\153\1\154\1\0\1\155"+
"\31\0\1\154\5\0\1\152\32\0\12\12\2\0\2\12"+
"\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
"\14\0\1\226\25\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\14\12\1\227\11\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\12\12\1\230\13\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\25\12\1\231\54\0\1\232\113\0\1\233\40\0\1\234"+
"\52\0\1\235\113\0\1\236\42\0\1\237\50\0\1\240"+
"\113\0\1\241\113\0\1\242\113\0\1\243\113\0\1\244"+
"\47\0\1\245\43\0\1\246\47\0\1\247\1\250\15\0"+
"\1\251\11\0\2\251\1\101\1\0\1\102\25\0\1\251"+
"\1\0\1\251\1\0\1\251\3\0\1\251\26\0\14\100"+
"\1\0\22\100\1\0\54\100\14\252\1\0\10\252\1\253"+
"\1\254\10\252\1\255\54\252\14\256\1\0\11\256\1\257"+
"\1\260\7\256\1\255\54\256\1\0\10\12\1\261\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\261\1\105"+
"\1\0\1\106\1\22\2\0\1\12\14\0\5\12\1\261"+
"\1\12\1\261\1\12\1\261\3\12\1\261\1\22\7\12"+
"\16\0\14\262\1\0\10\262\1\263\1\264\10\262\1\0"+
"\54\262\14\265\1\0\11\265\1\266\1\267\7\265\1\0"+
"\54\265\13\0\1\270\20\0\1\271\2\0\1\272\55\0"+
"\10\12\1\261\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\261\1\105\1\0\1\106\1\22\2\0\1\12"+
"\14\0\1\207\3\12\1\210\1\261\1\12\1\261\1\12"+
"\1\261\3\12\1\261\1\22\7\12\17\0\10\12\1\261"+
"\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\261"+
"\1\105\1\0\1\106\1\22\2\0\1\12\14\0\5\12"+
"\1\273\1\12\1\261\1\12\1\261\3\12\1\261\1\22"+
"\7\12\17\0\10\12\1\261\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\261\1\105\1\0\1\106\1\22"+
"\2\0\1\12\14\0\5\12\1\261\1\12\1\261\1\12"+
"\1\261\1\213\1\214\1\12\1\261\1\22\7\12\16\0"+
"\14\113\1\0\10\113\1\0\1\274\1\0\1\113\1\275"+
"\5\113\1\0\54\113\14\114\1\0\10\114\1\100\1\276"+
"\1\100\1\114\1\277\5\114\1\0\54\114\25\0\1\300"+
"\66\0\31\113\2\301\1\302\60\113\27\0\1\303\115\0"+
"\1\113\63\0\10\12\1\304\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\304\1\123\1\0\1\305\1\22"+
"\2\0\1\12\14\0\5\12\1\304\1\12\1\304\1\12"+
"\1\304\3\12\1\304\1\22\7\12\16\0\14\306\1\0"+
"\10\306\1\307\1\310\10\306\1\0\54\306\14\311\1\0"+
"\11\311\1\312\1\313\7\311\1\0\54\311\14\314\1\0"+
"\10\314\1\0\1\314\1\0\2\314\1\0\1\314\1\0"+
"\1\314\1\177\1\0\4\314\2\0\46\314\1\0\10\12"+
"\1\304\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
"\2\304\1\123\1\0\1\305\1\22\2\0\1\12\14\0"+
"\1\207\3\12\1\210\1\304\1\12\1\304\1\12\1\304"+
"\3\12\1\304\1\22\7\12\17\0\10\12\1\304\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\304\1\123"+
"\1\0\1\305\1\22\2\0\1\12\14\0\5\12\1\315"+
"\1\12\1\304\1\12\1\304\3\12\1\304\1\22\7\12"+
"\17\0\10\12\1\304\1\12\2\0\2\12\1\0\1\12"+
"\1\0\1\12\2\304\1\123\1\0\1\305\1\22\2\0"+
"\1\12\14\0\5\12\1\304\1\12\1\304\1\12\1\304"+
"\1\213\1\214\1\12\1\304\1\22\7\12\16\0\14\141"+
"\1\0\10\141\1\0\1\316\1\0\1\141\2\0\4\141"+
"\1\0\54\141\14\142\1\0\10\142\1\100\1\317\1\100"+
"\1\142\2\100\4\142\1\0\54\142\31\141\2\301\1\320"+
"\60\141\1\0\1\146\1\147\1\146\1\0\1\146\1\0"+
"\1\151\2\0\1\154\4\0\1\155\1\156\1\0\1\157"+
"\31\0\1\156\5\0\1\154\32\0\3\147\1\0\1\147"+
"\1\0\1\321\7\0\1\155\1\156\1\0\1\157\31\0"+
"\1\156\40\0\5\322\1\0\1\323\1\0\1\322\6\0"+
"\1\322\2\0\1\322\4\0\1\322\17\0\1\322\1\0"+
"\1\322\1\0\1\322\2\0\1\322\1\0\1\322\4\0"+
"\1\322\26\0\1\146\1\147\1\146\1\0\1\146\107\0"+
"\1\324\1\0\1\324\1\0\1\324\1\0\1\325\105\0"+
"\1\326\3\0\1\326\1\0\1\327\105\0\3\162\1\0"+
"\1\162\12\0\1\156\1\0\1\157\31\0\1\156\40\0"+
"\3\330\1\0\1\330\13\0\1\331\54\0\1\331\16\0"+
"\3\11\1\0\1\11\107\0\10\12\1\332\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\332\1\17\1\0"+
"\1\21\1\22\2\0\1\12\14\0\5\12\1\332\1\12"+
"\1\332\1\12\1\332\3\12\1\332\1\22\7\12\17\0"+
"\3\162\1\0\1\162\1\0\1\333\10\0\1\156\1\0"+
"\1\157\31\0\1\156\37\0\14\165\1\0\10\165\1\334"+
"\1\167\10\165\1\170\54\165\25\0\1\335\1\336\5\0"+
"\1\337\2\0\1\170\5\0\1\337\1\0\1\170\44\0"+
"\114\165\14\171\1\0\11\171\1\172\1\334\7\171\1\170"+
"\170\171\26\0\1\336\1\340\4\0\1\337\2\0\1\170"+
"\5\0\1\337\1\0\1\170\45\0\10\12\1\341\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\341\1\175"+
"\1\0\1\176\1\12\2\0\1\12\14\0\5\12\1\341"+
"\1\12\1\341\1\12\1\341\3\12\1\341\10\12\43\0"+
"\1\342\115\0\1\343\65\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\2\12\1\344\23\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\3\12\1\345\22\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\6\12\1\346\17\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\12\12\1\347\3\12\1\350\7\12\17\0\12\12\2\0"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
"\1\12\14\0\3\12\1\351\10\12\1\352\11\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\11\12\1\353\14\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\14\12\1\354\11\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\6\12\1\355\17\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\21\12\1\356\4\12\17\0"+
"\10\12\1\332\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\332\1\17\1\0\1\21\1\22\2\0\1\12"+
"\14\0\4\12\1\357\1\332\1\12\1\332\1\12\1\332"+
"\3\12\1\332\1\22\7\12\17\0\12\12\2\0\2\12"+
"\14\0\26\12\17\0\10\12\1\157\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\157\1\17\1\0\1\21"+
"\1\22\2\0\1\12\14\0\5\12\1\157\1\12\1\157"+
"\1\12\1\157\3\12\1\157\1\22\7\12\16\0\14\14"+
"\1\0\22\14\1\0\54\14\1\0\3\160\1\0\1\160"+
"\144\0\1\161\47\0\1\162\5\0\14\163\1\0\10\163"+
"\1\164\1\165\10\163\1\166\54\163\14\167\1\0\11\167"+
"\1\170\1\171\7\167\1\166\54\167\1\0\10\12\1\172"+
"\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\172"+
"\1\173\1\0\1\174\1\12\2\0\1\12\14\0\5\12"+
"\1\172\1\12\1\172\1\12\1\172\3\12\1\172\10\12"+
"\54\0\1\175\113\0\1\176\56\0\12\12\2\0\2\12"+
"\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
"\14\0\1\360\25\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\1\12\1\361\24\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\22\12\1\362\3\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\20\12\1\363\5\12\17\0\10\12\1\341\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\341\1\175\1\0"+
"\1\176\1\12\2\0\1\12\14\0\5\12\1\341\1\12"+
"\1\341\1\12\1\341\1\12\1\364\1\12\1\341\10\12"+
"\14\0\1\12\1\177\1\12\1\200\22\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\13\12\1\201\12\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\4\12\1\202\21\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\12\12\1\203\4\12\1\204\6\12"+
"\17\0\10\12\1\157\1\12\2\0\2\12\1\0\1\12"+
"\1\0\1\12\2\157\1\17\1\0\1\21\1\22\2\0"+
"\1\12\14\0\1\205\3\12\1\206\1\157\1\12\1\157"+
"\1\12\1\157\3\12\1\157\1\22\7\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\207\20\12\17\0\10\12"+
"\1\157\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
"\2\157\1\17\1\0\1\21\1\22\2\0\1\12\14\0"+
"\5\12\1\210\1\12\1\157\1\12\1\157\3\12\1\157"+
"\1\22\7\12\17\0\10\12\1\157\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\157\1\17\1\0\1\21"+
"\1\22\2\0\1\12\14\0\5\12\1\157\1\12\1\157"+
"\1\12\1\157\1\211\1\212\1\12\1\157\1\22\7\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\5\12\1\365\20\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\1\12\1\366\24\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\3\12\1\367\22\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\4\12\1\370\21\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\13\12\1\371\12\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\14\12\1\372\11\12"+
"\54\0\1\373\113\0\1\374\113\0\1\375\113\0\1\376"+
"\66\0\1\377\11\0\2\377\1\101\1\0\1\102\25\0"+
"\1\377\1\0\1\377\1\0\1\377\3\0\1\377\26\0"+
"\14\252\1\0\10\252\1\u0100\1\254\10\252\1\255\54\252"+
"\25\0\1\u0101\1\u0102\5\0\1\u0103\2\0\1\255\5\0"+
"\1\u0103\1\0\1\255\44\0\114\252\14\256\1\0\11\256"+
"\1\257\1\u0100\7\256\1\255\170\256\26\0\1\u0102\1\u0104"+
"\4\0\1\u0103\2\0\1\255\5\0\1\u0103\1\0\1\255"+
"\45\0\10\12\1\u0105\1\12\2\0\2\12\1\0\1\12"+
"\1\0\1\12\2\u0105\1\105\1\0\1\106\1\22\2\0"+
"\1\12\14\0\5\12\1\u0105\1\12\1\u0105\1\12\1\u0105"+
"\3\12\1\u0105\1\22\7\12\16\0\14\262\1\0\10\262"+
"\1\u0106\1\264\10\262\1\0\54\262\25\0\1\u0107\66\0"+
"\114\262\14\265\1\0\11\265\1\266\1\u0106\7\265\1\0"+
"\170\265\27\0\1\u0108\64\0\14\270\1\0\22\270\1\272"+
"\54\270\1\0\10\12\1\u0105\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\u0105\1\105\1\0\1\106\1\22"+
"\2\0\1\12\14\0\4\12\1\357\1\u0105\1\12\1\u0105"+
"\1\12\1\u0105\3\12\1\u0105\1\22\7\12\16\0\31\113"+
"\2\0\1\302\60\113\14\114\1\113\14\114\2\100\1\u0109"+
"\3\114\1\113\54\114\14\100\1\0\14\100\1\114\5\100"+
"\1\0\54\100\25\0\1\u010a\66\0\14\113\1\0\10\113"+
"\1\0\1\274\1\0\1\113\1\302\5\113\1\0\54\113"+
"\27\0\1\u010a\65\0\10\12\1\u010b\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\u010b\1\123\1\0\1\305"+
"\1\22\2\0\1\12\14\0\5\12\1\u010b\1\12\1\u010b"+
"\1\12\1\u010b\3\12\1\u010b\1\22\7\12\16\0\14\311"+
"\1\0\11\311\1\312\1\u010c\7\311\1\0\54\311\14\306"+
"\1\0\10\306\1\u010d\1\310\10\306\1\0\170\306\14\311"+
"\1\0\11\311\1\312\1\u010d\7\311\1\0\170\311\27\0"+
"\1\u010e\64\0\14\314\1\0\10\314\1\0\1\314\1\0"+
"\2\314\1\0\1\314\1\0\1\314\2\0\4\314\2\0"+
"\46\314\1\0\10\12\1\u010b\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\u010b\1\123\1\0\1\305\1\22"+
"\2\0\1\12\14\0\4\12\1\357\1\u010b\1\12\1\u010b"+
"\1\12\1\u010b\3\12\1\u010b\1\22\7\12\16\0\31\141"+
"\2\0\1\320\60\141\14\142\1\141\14\142\2\100\1\u010f"+
"\3\142\1\141\54\142\14\141\1\0\10\141\1\0\1\316"+
"\1\0\1\141\1\u0110\1\0\4\141\1\0\54\141\1\0"+
"\3\147\1\0\1\147\107\0\5\322\1\0\1\323\1\0"+
"\1\322\1\154\5\0\1\322\2\0\1\322\4\0\1\322"+
"\17\0\1\322\1\0\1\322\1\0\1\322\2\0\1\322"+
"\1\0\1\322\1\154\3\0\1\322\26\0\5\322\3\0"+
"\1\322\6\0\1\322\2\0\1\322\4\0\1\322\17\0"+
"\1\322\1\0\1\322\1\0\1\322\2\0\1\322\1\0"+
"\1\322\4\0\1\322\26\0\1\324\1\0\1\324\1\0"+
"\1\324\1\0\1\325\2\0\1\154\47\0\1\154\32\0"+
"\1\324\1\0\1\324\1\0\1\324\107\0\1\326\3\0"+
"\1\326\1\0\1\327\2\0\1\154\47\0\1\154\32\0"+
"\1\326\3\0\1\326\107\0\3\330\1\0\1\330\1\0"+
"\1\331\12\0\1\157\72\0\3\330\1\0\1\330\107\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\17"+
"\1\0\1\21\1\22\2\0\1\12\14\0\16\12\1\22"+
"\7\12\44\0\1\336\5\0\1\337\2\0\1\170\5\0"+
"\1\337\1\0\1\170\44\0\25\335\1\u0111\1\u0112\65\335"+
"\26\340\1\u0113\1\u0114\64\340\1\0\10\12\1\u0115\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\u0115\1\175"+
"\1\0\1\176\1\12\2\0\1\12\14\0\5\12\1\u0115"+
"\1\12\1\u0115\1\12\1\u0115\3\12\1\u0115\10\12\43\0"+
"\1\u0116\115\0\1\u0116\65\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\4\12\1\u0117\21\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\4\12\1\u0118\21\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\16\12\1\u0119\7\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\4\12\1\u011a\21\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\3\12\1\u011b\22\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\15\12\1\u011c\10\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\1\u011d\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+
"\1\u011e\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
"\1\u011f\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\7\12"+
"\1\u0120\16\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\13\12"+
"\1\u0121\12\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\22\12"+
"\1\u0122\3\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0123"+
"\3\0\1\12\2\0\1\12\14\0\1\213\25\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\5\12\1\214\20\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\1\12\1\215\1\12\1\216"+
"\12\12\1\217\3\12\1\220\3\12\17\0\10\12\1\172"+
"\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\172"+
"\1\173\1\0\1\174\1\12\2\0\1\12\14\0\5\12"+
"\1\221\1\12\1\172\1\12\1\172\1\12\1\222\1\223"+
"\1\172\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\224"+
"\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0124"+
"\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0125"+
"\3\12\3\0\1\12\2\0\1\12\14\0\14\12\1\225"+
"\11\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\226"+
"\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0126"+
"\3\12\3\0\1\12\2\0\1\12\14\0\25\12\1\227"+
"\54\0\1\230\113\0\1\231\40\0\1\232\52\0\1\233"+
"\113\0\1\234\42\0\1\235\50\0\1\236\113\0\1\237"+
"\113\0\1\240\113\0\1\241\113\0\1\242\47\0\1\243"+
"\43\0\1\244\47\0\1\245\1\246\15\0\1\247\11\0"+
"\2\247\1\101\1\0\1\102\25\0\1\247\1\0\1\247"+
"\1\0\1\247\3\0\1\247\26\0\14\100\1\0\22\100"+
"\1\0\54\100\14\250\1\0\10\250\1\251\1\252\10\250"+
"\1\253\54\250\14\254\1\0\11\254\1\255\1\256\7\254"+
"\1\253\54\254\1\0\10\12\1\257\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\257\1\105\1\0\1\106"+
"\1\22\2\0\1\12\14\0\5\12\1\257\1\12\1\257"+
"\1\12\1\257\3\12\1\257\1\22\7\12\16\0\14\260"+
"\1\0\10\260\1\261\1\262\10\260\1\0\54\260\14\263"+
"\1\0\11\263\1\264\1\265\7\263\1\0\54\263\13\0"+
"\1\266\20\0\1\267\2\0\1\270\55\0\10\12\1\257"+
"\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\257"+
"\1\105\1\0\1\106\1\22\2\0\1\12\14\0\1\205"+
"\3\12\1\206\1\257\1\12\1\257\1\12\1\257\3\12"+
"\1\257\1\22\7\12\17\0\10\12\1\257\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\257\1\105\1\0"+
"\1\106\1\22\2\0\1\12\14\0\5\12\1\271\1\12"+
"\1\257\1\12\1\257\3\12\1\257\1\22\7\12\17\0"+
"\10\12\1\257\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\257\1\105\1\0\1\106\1\22\2\0\1\12"+
"\14\0\5\12\1\257\1\12\1\257\1\12\1\257\1\211"+
"\1\212\1\12\1\257\1\22\7\12\16\0\14\113\1\0"+
"\10\113\1\0\1\272\1\0\1\113\1\273\5\113\1\0"+
"\54\113\25\0\1\274\66\0\31\113\2\275\1\276\60\113"+
"\27\0\1\277\115\0\1\113\63\0\10\12\1\300\1\12"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\300\1\122"+
"\1\0\1\301\1\22\2\0\1\12\14\0\5\12\1\300"+
"\1\12\1\300\1\12\1\300\3\12\1\300\1\22\7\12"+
"\16\0\14\302\1\0\10\302\1\303\1\304\10\302\1\0"+
"\54\302\14\305\1\0\11\305\1\306\1\307\7\305\1\0"+
"\54\305\14\310\1\0\10\310\1\0\1\310\1\0\2\310"+
"\1\0\1\310\1\0\1\310\1\175\1\0\4\310\2\0"+
"\46\310\1\0\10\12\1\300\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\300\1\122\1\0\1\301\1\22"+
"\2\0\1\12\14\0\1\205\3\12\1\206\1\300\1\12"+
"\1\300\1\12\1\300\3\12\1\300\1\22\7\12\17\0"+
"\10\12\1\300\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\300\1\122\1\0\1\301\1\22\2\0\1\12"+
"\14\0\5\12\1\311\1\12\1\300\1\12\1\300\3\12"+
"\1\300\1\22\7\12\17\0\10\12\1\300\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\300\1\122\1\0"+
"\1\301\1\22\2\0\1\12\14\0\5\12\1\300\1\12"+
"\1\300\1\12\1\300\1\211\1\212\1\12\1\300\1\22"+
"\7\12\16\0\14\140\1\0\10\140\1\0\1\312\1\0"+
"\1\140\2\0\4\140\1\0\105\140\2\275\1\313\60\140"+
"\1\0\1\144\1\145\1\144\1\0\1\144\1\0\1\147"+
"\2\0\1\152\4\0\1\153\1\154\1\0\1\155\31\0"+
"\1\154\5\0\1\152\32\0\3\145\1\0\1\145\1\0"+
"\1\314\7\0\1\153\1\154\1\0\1\155\31\0\1\154"+
"\40\0\5\315\1\0\1\316\1\0\1\315\6\0\1\315"+
"\2\0\1\315\4\0\1\315\17\0\1\315\1\0\1\315"+
"\1\0\1\315\2\0\1\315\1\0\1\315\4\0\1\315"+
"\26\0\1\144\1\145\1\144\1\0\1\144\107\0\1\317"+
"\1\0\1\317\1\0\1\317\1\0\1\320\105\0\1\321"+
"\3\0\1\321\1\0\1\322\105\0\3\160\1\0\1\160"+
"\12\0\1\154\1\0\1\155\31\0\1\154\40\0\3\323"+
"\1\0\1\323\13\0\1\324\54\0\1\324\16\0\3\11"+
"\1\0\1\11\107\0\10\12\1\325\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\325\1\17\1\0\1\21"+
"\1\22\2\0\1\12\14\0\5\12\1\325\1\12\1\325"+
"\1\12\1\325\3\12\1\325\1\22\7\12\17\0\3\160"+
"\1\0\1\160\1\0\1\326\10\0\1\154\1\0\1\155"+
"\31\0\1\154\37\0\14\163\1\0\10\163\1\327\1\165"+
"\10\163\1\166\54\163\25\0\1\330\1\331\5\0\1\332"+
"\2\0\1\166\5\0\1\332\1\0\1\166\44\0\114\163"+
"\14\167\1\0\11\167\1\170\1\327\7\167\1\166\170\167"+
"\26\0\1\331\1\333\4\0\1\332\2\0\1\166\5\0"+
"\1\332\1\0\1\166\45\0\10\12\1\334\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\334\1\173\1\0"+
"\1\174\1\12\2\0\1\12\14\0\5\12\1\334\1\12"+
"\1\334\1\12\1\334\3\12\1\334\10\12\43\0\1\335"+
"\115\0\1\336\65\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\2\12"+
"\1\337\23\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+
"\1\340\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
"\1\341\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\12\12"+
"\1\342\3\12\1\343\7\12\17\0\12\12\2\0\2\12"+
"\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
"\14\0\3\12\1\344\10\12\1\345\11\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\11\12\1\346\14\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\14\12\1\347\11\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\6\12\1\350\17\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\21\12\1\351\4\12\17\0\10\12"+
"\1\325\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
"\2\325\1\17\1\0\1\21\1\22\2\0\1\12\14\0"+
"\4\12\1\352\1\325\1\12\1\325\1\12\1\325\3\12"+
"\1\325\1\22\7\12\17\0\12\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
"\1\353\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+
"\1\354\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\22\12"+
"\1\355\3\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\20\12"+
"\1\356\5\12\17\0\10\12\1\334\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\334\1\173\1\0\1\174"+
"\1\12\2\0\1\12\14\0\5\12\1\334\1\12\1\334"+
"\1\12\1\334\1\12\1\357\1\12\1\334\10\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\5\12\1\360\20\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\1\12\1\361\24\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\3\12\1\362\22\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\4\12\1\363\21\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\13\12\1\364\12\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\14\12\1\365\11\12\54\0"+
"\1\366\113\0\1\367\113\0\1\370\113\0\1\371\66\0"+
"\1\372\11\0\2\372\1\101\1\0\1\102\25\0\1\372"+
"\1\0\1\372\1\0\1\372\3\0\1\372\26\0\14\250"+
"\1\0\10\250\1\373\1\252\10\250\1\253\54\250\25\0"+
"\1\374\1\375\5\0\1\376\2\0\1\253\5\0\1\376"+
"\1\0\1\253\44\0\114\250\14\254\1\0\11\254\1\255"+
"\1\373\7\254\1\253\170\254\26\0\1\375\1\377\4\0"+
"\1\376\2\0\1\253\5\0\1\376\1\0\1\253\45\0"+
"\10\12\1\u0100\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\12\2\u0100\1\105\1\0\1\106\1\22\2\0\1\12"+
"\14\0\5\12\1\u0100\1\12\1\u0100\1\12\1\u0100\3\12"+
"\1\u0100\1\22\7\12\16\0\14\260\1\0\10\260\1\u0101"+
"\1\262\10\260\1\0\54\260\25\0\1\u0102\66\0\114\260"+
"\14\263\1\0\11\263\1\264\1\u0101\7\263\1\0\170\263"+
"\27\0\1\u0103\64\0\14\266\1\0\22\266\1\270\54\266"+
"\1\0\10\12\1\u0100\1\12\2\0\2\12\1\0\1\12"+
"\1\0\1\12\2\u0100\1\105\1\0\1\106\1\22\2\0"+
"\1\12\14\0\4\12\1\352\1\u0100\1\12\1\u0100\1\12"+
"\1\u0100\3\12\1\u0100\1\22\7\12\16\0\31\113\2\0"+
"\1\276\60\113\25\0\1\u0104\66\0\14\113\1\0\10\113"+
"\1\0\1\272\1\0\1\113\1\276\5\113\1\0\54\113"+
"\27\0\1\u0104\65\0\10\12\1\u0105\1\12\2\0\2\12"+
"\1\0\1\12\1\0\1\12\2\u0105\1\122\1\0\1\301"+
"\1\22\2\0\1\12\14\0\5\12\1\u0105\1\12\1\u0105"+
"\1\12\1\u0105\3\12\1\u0105\1\22\7\12\16\0\14\305"+
"\1\0\11\305\1\306\1\u0106\7\305\1\0\54\305\14\302"+
"\1\0\10\302\1\u0107\1\304\10\302\1\0\170\302\14\305"+
"\1\0\11\305\1\306\1\u0107\7\305\1\0\170\305\27\0"+
"\1\u0108\64\0\14\310\1\0\10\310\1\0\1\310\1\0"+
"\2\310\1\0\1\310\1\0\1\310\2\0\4\310\2\0"+
"\46\310\1\0\10\12\1\u0105\1\12\2\0\2\12\1\0"+
"\1\12\1\0\1\12\2\u0105\1\122\1\0\1\301\1\22"+
"\2\0\1\12\14\0\4\12\1\352\1\u0105\1\12\1\u0105"+
"\1\12\1\u0105\3\12\1\u0105\1\22\7\12\16\0\31\140"+
"\2\0\1\313\74\140\1\0\10\140\1\0\1\312\1\0"+
"\1\140\1\u0109\1\0\4\140\1\0\54\140\1\0\3\145"+
"\1\0\1\145\107\0\5\315\1\0\1\316\1\0\1\315"+
"\1\152\5\0\1\315\2\0\1\315\4\0\1\315\17\0"+
"\1\315\1\0\1\315\1\0\1\315\2\0\1\315\1\0"+
"\1\315\1\152\3\0\1\315\26\0\5\315\3\0\1\315"+
"\6\0\1\315\2\0\1\315\4\0\1\315\17\0\1\315"+
"\1\0\1\315\1\0\1\315\2\0\1\315\1\0\1\315"+
"\4\0\1\315\26\0\1\317\1\0\1\317\1\0\1\317"+
"\1\0\1\320\2\0\1\152\47\0\1\152\32\0\1\317"+
"\1\0\1\317\1\0\1\317\107\0\1\321\3\0\1\321"+
"\1\0\1\322\2\0\1\152\47\0\1\152\32\0\1\321"+
"\3\0\1\321\107\0\3\323\1\0\1\323\1\0\1\324"+
"\12\0\1\155\72\0\3\323\1\0\1\323\107\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\1\17\1\0"+
"\1\21\1\22\2\0\1\12\14\0\16\12\1\22\7\12"+
"\44\0\1\331\5\0\1\332\2\0\1\166\5\0\1\332"+
"\1\0\1\166\44\0\25\330\1\u010a\1\u010b\65\330\26\333"+
"\1\u010c\1\u010d\64\333\1\0\10\12\1\u010e\1\12\2\0"+
"\2\12\1\0\1\12\1\0\1\12\2\u010e\1\173\1\0"+
"\1\174\1\12\2\0\1\12\14\0\5\12\1\u010e\1\12"+
"\1\u010e\1\12\1\u010e\3\12\1\u010e\10\12\43\0\1\u010f"+
"\115\0\1\u010f\65\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
"\1\u0110\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
"\1\u0111\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\16\12"+
"\1\u0112\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
"\1\u0113\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+
"\1\u0114\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\15\12"+
"\1\u0115\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0116"+
"\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0117"+
"\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0118"+
"\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0119"+
"\16\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0127"+
"\13\12\43\0\1\101\1\0\1\102\112\0\1\u0102\5\0"+
"\1\u0103\2\0\1\255\5\0\1\u0103\1\0\1\255\44\0"+
"\25\u0101\1\u0128\1\u0129\65\u0101\26\u0104\1\u012a\1\u012b\64\u0104"+
"\1\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\1\105\1\0\1\106\1\22\2\0\1\12\14\0\16\12"+
"\1\22\7\12\16\0\25\u0107\1\u012c\1\u012d\65\u0107\26\u0108"+
"\1\u012e\1\u012f\64\u0108\14\114\1\0\10\114\1\100\1\276"+
"\1\100\1\114\1\u0109\5\114\1\0\54\114\1\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\1\123\1\0"+
"\1\305\1\22\2\0\1\12\14\0\16\12\1\22\7\12"+
"\16\0\26\u010e\1\u0130\1\u0131\64\u010e\14\142\1\0\10\142"+
"\1\100\1\317\1\100\1\142\1\u0132\1\100\4\142\1\0"+
"\54\142\1\141\12\u0110\1\141\1\0\2\u0110\1\141\1\u0110"+
"\1\141\3\u0110\1\0\1\316\1\0\1\u0110\1\0\1\141"+
"\2\u0110\2\141\1\0\10\141\26\u0110\16\141\25\335\1\u0133"+
"\1\u0134\201\335\142\340\1\u0135\1\u0136\64\340\1\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\1\175\1\0"+
"\1\176\1\12\2\0\1\12\14\0\26\12\17\0\12\12"+
"\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\u011a"+
"\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\22\12\1\u011b"+
"\3\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\1\u011c\25\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\3\12\1\u011d\22\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\12\12\1\u011e\13\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\7\12\1\u011f\16\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\12\12\1\u0120\13\12"+
"\43\0\1\101\1\0\1\102\112\0\1\375\5\0\1\376"+
"\2\0\1\253\5\0\1\376\1\0\1\253\44\0\25\374"+
"\1\u0121\1\u0122\65\374\26\377\1\u0123\1\u0124\64\377\1\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\105"+
"\1\0\1\106\1\22\2\0\1\12\14\0\16\12\1\22"+
"\7\12\16\0\25\u0102\1\u0125\1\u0126\65\u0102\26\u0103\1\u0127"+
"\1\u0128\64\u0103\1\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\1\122\1\0\1\301\1\22\2\0\1\12"+
"\14\0\16\12\1\22\7\12\16\0\26\u0108\1\u0129\1\u012a"+
"\64\u0108\1\140\12\u0109\1\140\1\0\2\u0109\1\140\1\u0109"+
"\1\140\3\u0109\1\0\1\312\1\0\1\u0109\1\0\1\140"+
"\2\u0109\2\140\1\0\10\140\26\u0109\16\140\25\330\1\u012b"+
"\1\u012c\201\330\142\333\1\u012d\1\u012e\64\333\1\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\1\173\1\0"+
"\1\174\1\12\2\0\1\12\14\0\26\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\u012f\20\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\20\12\1\u0130\5\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\4\12\1\u0131\21\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\u0132\20\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\10\12\1\u0133\15\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\3\12\1\u0134\22\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\14\12\1\u0135\11\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\2\12\1\u0136\23\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\u0137\20\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\20\12\1\u0138\5\12\17\0\12\12"+
"\2\0\1\12\14\0\12\12\1\u0138\13\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\4\12\1\u0139\21\12\17\0\12\12"+
"\2\0\1\12\14\0\2\12\1\u0139\23\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\u013a\20\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\10\12\1\u013b\15\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\3\12\1\u013c\22\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\14\12\1\u013d\11\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\2\12\1\u013e\23\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\5\12\1\u013f\20\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\12\12\1\u0140\13\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\2\12\1\u0141\23\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\1\u0142\25\12\17\0\12\12\2\0"+
"\2\0\1\12\14\0\1\u013a\25\12\17\0\12\12\2\0"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
"\1\12\14\0\4\12\1\u0143\21\12\16\0\25\u0101\1\u0144"+
"\1\u0145\201\u0101\142\u0104\1\u0146\1\u0147\64\u0104\25\u0107\1\u0148"+
"\1\u012d\201\u0107\142\u0108\1\u012e\1\u0149\64\u0108\142\u010e\1\u0130"+
"\1\u014a\64\u010e\1\142\12\u0132\1\142\1\0\2\u0132\1\142"+
"\1\u0132\1\142\3\u0132\1\100\1\317\1\100\1\u0132\1\100"+
"\1\142\2\u0132\2\142\1\0\10\142\26\u0132\16\142\25\335"+
"\1\u014b\1\u0134\65\335\26\340\1\u0135\1\u014b\64\340\1\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\6\12\1\u014c\17\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\6\12\1\u014d\17\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\1\12\1\u014e\24\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\1\12\1\u014f\24\12\17\0"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
"\1\12\2\0\1\12\14\0\1\u0150\25\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\6\12\1\u0151\17\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\12\12\1\u0152\13\12\17\0\12\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\2\0\1\12\14\0\12\12\1\u0153\13\12\16\0\25\u0101"+
"\1\u0154\1\u0145\65\u0101\26\u0104\1\u0146\1\u0154\64\u0104\25\u0107"+
"\1\u0155\1\u012d\65\u0107\26\u0108\1\u012e\1\u0155\64\u0108\26\u010e"+
"\1\u0130\1\u0156\64\u010e\26\0\1\u0157\5\0\1\u0158\2\0"+
"\1\u0159\5\0\1\u0158\1\0\1\u0159\45\0\12\12\2\0"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
"\1\12\14\0\15\12\1\u015a\10\12\17\0\12\12\2\0"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
"\1\12\14\0\21\12\1\u015b\4\12\17\0\12\12\2\0"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
"\1\12\14\0\4\12\1\u015c\21\12\16\0";
"\1\12\14\0\4\12\1\u013b\21\12\16\0\25\374\1\u013c"+
"\1\u013d\201\374\142\377\1\u013e\1\u013f\64\377\25\u0102\1\u0140"+
"\1\u0126\201\u0102\142\u0103\1\u0127\1\u0141\64\u0103\142\u0108\1\u0129"+
"\1\u0142\64\u0108\25\330\1\u0143\1\u012c\65\330\26\333\1\u012d"+
"\1\u0143\64\333\1\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
"\1\u0144\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
"\1\u0145\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+
"\1\u0146\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+
"\1\u0147\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0148"+
"\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0149"+
"\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u014a"+
"\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
"\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u014b"+
"\13\12\16\0\25\374\1\u014c\1\u013d\65\374\26\377\1\u013e"+
"\1\u014c\64\377\25\u0102\1\u014d\1\u0126\65\u0102\26\u0103\1\u0127"+
"\1\u014d\64\u0103\26\u0108\1\u0129\1\u014e\64\u0108\26\0\1\u014f"+
"\5\0\1\u0150\2\0\1\u0151\5\0\1\u0150\1\0\1\u0151"+
"\45\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\15\12\1\u0152\10\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\21\12\1\u0153\4\12"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\3\0\1\12\2\0\1\12\14\0\4\12\1\u0154\21\12"+
"\16\0";
private static int [] zzUnpackTrans() {
int [] result = new int[18544];
int [] result = new int[17936];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -733,21 +721,21 @@ class _PythonLexer implements FlexLexerEx {
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\6\0\1\11\10\1\1\11\2\1\3\11\2\1\11\11"+
"\32\1\4\11\4\1\1\11\15\1\1\11\3\1\2\11"+
"\1\1\6\11\6\1\2\11\1\1\5\0\1\11\1\1"+
"\32\1\4\11\4\1\1\11\14\1\1\11\3\1\2\11"+
"\1\1\6\11\5\1\2\11\1\1\5\0\1\11\1\1"+
"\1\0\1\11\1\0\2\1\2\11\3\1\1\11\6\1"+
"\2\11\31\1\2\11\1\1\2\11\1\1\5\11\1\1"+
"\2\11\1\1\1\0\3\1\1\11\12\1\2\0\1\11"+
"\1\1\2\0\3\1\1\11\14\1\1\0\2\1\1\0"+
"\1\1\2\0\1\1\1\11\14\1\1\0\1\1\1\0"+
"\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+
"\1\1\1\0\2\1\1\11\1\0\2\1\2\0\27\1"+
"\4\11\1\0\2\1\1\11\1\0\2\1\1\11\3\1"+
"\1\11\2\1\1\11\3\1\1\0\2\1\1\0\1\1"+
"\1\11\21\1\1\0\2\1\7\0\1\1\4\0\15\1"+
"\7\0\12\1\3\11\1\0\1\11\3\1";
"\4\11\1\0\2\1\1\11\1\0\2\1\1\11\2\1"+
"\1\11\2\1\1\11\2\1\1\0\2\1\1\0\1\1"+
"\1\11\21\1\1\0\2\1\13\0\15\1\7\0\12\1"+
"\3\11\1\0\1\11\3\1";
private static int [] zzUnpackAttribute() {
int [] result = new int[348];
int [] result = new int[340];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -83,9 +83,9 @@ FSTRING_FRAGMENT_TYPE_CONVERSION = "!" [^=:'\"} \t\r\n]*
%state PENDING_DOCSTRING
%state IN_DOCSTRING_OWNER
%state FSTRING
%xstate FSTRING
%state FSTRING_FRAGMENT
%state FSTRING_FRAGMENT_FORMAT
%xstate FSTRING_FRAGMENT_FORMAT
%{
private final PyLexerFStringHelper fStringHelper = new PyLexerFStringHelper(this);
@@ -107,6 +107,7 @@ return yylength()-s.length();
{BACKSLASH_ESCAPED_BRACES} { yypushback(1); return PyTokenTypes.FSTRING_TEXT; }
{FSTRING_QUOTES} { return fStringHelper.handleFStringEnd(); }
"{" { return fStringHelper.handleFragmentStart(); }
[^] { return PyTokenTypes.BAD_CHARACTER; }
}
<FSTRING_FRAGMENT> {
@@ -141,6 +142,7 @@ return yylength()-s.length();
// format part of a fragment can contain opening quotes
{FSTRING_QUOTES} { return fStringHelper.handleFStringEnd(); }
[^] { return PyTokenTypes.BAD_CHARACTER; }
}
[\ ] { return PyTokenTypes.SPACE; }
@@ -1,7 +1,7 @@
f'{<error descr="Expression fragments inside f-strings cannot include line comments"><error descr="expression expected">#'</error></error><EOLError descr="type conversion, : or } expected"></EOLError><EOLError descr="' expected"></EOLError>
f'{<error descr="Expression fragments inside f-strings cannot include line comments"><error descr="expression expected">#</error></error><EOLError descr="type conversion, : or } expected"></EOLError><EOLError descr="' expected"></EOLError>
f'{<error descr="Expression fragments inside f-strings cannot include line comments"><error descr="expression expected">#foo#}'</error></error><EOLError descr="type conversion, : or } expected"></EOLError><EOLError descr="' expected"></EOLError>
f'{42:<error descr="Expression fragments inside f-strings cannot include line comments"><error descr="} expected">#</error>}'</error><EOLError descr="' expected"></EOLError>
f'{42:#}'
f'{42:{<error descr="Expression fragments inside f-strings cannot include line comments"><error descr="expression expected">#}}'</error></error><EOLError descr="type conversion, : or } expected"></EOLError><EOLError descr="' expected"></EOLError>
f'{x<error descr="type conversion, : or } expected"> </error><error descr="Expression fragments inside f-strings cannot include line comments">### foo}'</error><EOLError descr="' expected"></EOLError>
f'{"###"}'
@@ -0,0 +1 @@
s = f'#foo'
@@ -0,0 +1,12 @@
PyFile:FStringContainsHashInLiteralPart.py
PyAssignmentStatement
PyTargetExpression: s
PsiElement(Py:IDENTIFIER)('s')
PsiWhiteSpace(' ')
PsiElement(Py:EQ)('=')
PsiWhiteSpace(' ')
PyStringLiteralExpression: #foo
PyFormattedStringNode
PsiElement(Py:FSTRING_START)('f'')
PsiElement(Py:FSTRING_TEXT)('#foo')
PsiElement(Py:FSTRING_END)(''')
@@ -0,0 +1 @@
s = f'{42:#b}'
@@ -0,0 +1,19 @@
PyFile:FStringContainsHashSignInFormatPart.py
PyAssignmentStatement
PyTargetExpression: s
PsiElement(Py:IDENTIFIER)('s')
PsiWhiteSpace(' ')
PsiElement(Py:EQ)('=')
PsiWhiteSpace(' ')
PyStringLiteralExpression: {42:#b}
PyFormattedStringNode
PsiElement(Py:FSTRING_START)('f'')
PyFStringFragment
PsiElement(Py:FSTRING_FRAGMENT_START)('{')
PyNumericLiteralExpression
PsiElement(Py:INTEGER_LITERAL)('42')
PyFStringFragmentFormatPart
PsiElement(Py:FSTRING_FRAGMENT_FORMAT_START)(':')
PsiElement(Py:FSTRING_TEXT)('#b')
PsiElement(Py:FSTRING_FRAGMENT_END)('}')
PsiElement(Py:FSTRING_END)(''')
@@ -0,0 +1 @@
s = f'{42:\
@@ -0,0 +1,21 @@
PyFile:UnterminatedFStringWithTrailingBackslashInFormatPart.py
PyAssignmentStatement
PyTargetExpression: s
PsiElement(Py:IDENTIFIER)('s')
PsiWhiteSpace(' ')
PsiElement(Py:EQ)('=')
PsiWhiteSpace(' ')
PyStringLiteralExpression: {42:
PyFormattedStringNode
PsiElement(Py:FSTRING_START)('f'')
PyFStringFragment
PsiElement(Py:FSTRING_FRAGMENT_START)('{')
PyNumericLiteralExpression
PsiElement(Py:INTEGER_LITERAL)('42')
PyFStringFragmentFormatPart
PsiElement(Py:FSTRING_FRAGMENT_FORMAT_START)(':')
PsiErrorElement:} expected
<empty list>
PsiElement(BAD_CHARACTER)('\')
PsiErrorElement:Statement expected, found BAD_CHARACTER
<empty list>
@@ -0,0 +1,15 @@
PyFile:UnterminatedFStringWithTrailingBackslashInLiteralPart.py
PyAssignmentStatement
PyTargetExpression: s
PsiElement(Py:IDENTIFIER)('s')
PsiWhiteSpace(' ')
PsiElement(Py:EQ)('=')
PsiWhiteSpace(' ')
PyStringLiteralExpression:
PyFormattedStringNode
PsiElement(Py:FSTRING_START)('f'')
PsiErrorElement:unexpected f-string token
<empty list>
PsiElement(BAD_CHARACTER)('\')
PsiErrorElement:Statement expected, found BAD_CHARACTER
<empty list>
@@ -773,6 +773,22 @@ public class PythonParsingTest extends ParsingTestCase {
doTest(LanguageLevel.PYTHON36);
}
public void testFStringContainsHashSignInFormatPart() {
doTest(LanguageLevel.PYTHON36);
}
public void testFStringContainsHashInLiteralPart() {
doTest(LanguageLevel.PYTHON36);
}
public void testUnterminatedFStringWithTrailingBackslashInLiteralPart() {
doTest(LanguageLevel.PYTHON36);
}
public void testUnterminatedFStringWithTrailingBackslashInFormatPart() {
doTest(LanguageLevel.PYTHON36);
}
public void testMultilineFStringContainsCommentInsideExpression() {
doTest(LanguageLevel.PYTHON36);
}