diff options
author | bptato <nincsnevem662@gmail.com> | 2024-01-04 18:01:35 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-01-04 18:01:35 +0100 |
commit | c9337674db699951918225cddc56fcf75f313a15 (patch) | |
tree | 1273d92050a20c8b093c27aca748ba654a4d1733 /res | |
parent | c7b46f6f08d38b48af8583adbb3ae288a1f2135d (diff) | |
download | chawan-c9337674db699951918225cddc56fcf75f313a15.tar.gz |
idna: use pre-generated map file, misc changes
Speeds up compilation somewhat. Included in the repository because it's not that huge. misc changes: * use seq, not set for UCS-16 sets (it takes up less space) * remove unnecessary noSideEffects casts
Diffstat (limited to 'res')
-rw-r--r-- | res/genidna.nim | 218 | ||||
-rw-r--r-- | res/map/idna_gen.nim | 2419 |
2 files changed, 2637 insertions, 0 deletions
diff --git a/res/genidna.nim b/res/genidna.nim new file mode 100644 index 00000000..772c88d0 --- /dev/null +++ b/res/genidna.nim @@ -0,0 +1,218 @@ +import std/sets +import std/streams +import std/strutils +import std/unicode + +type + LowMap = seq[tuple[ucs: uint16, s: string]] + HighMap = seq[tuple[ucs: uint32, s: string]] + FullRangeList = tuple[lm: seq[(uint16, uint16)], hm: seq[(uint32, uint32)]] + FullSet = tuple[lm: seq[uint16], hm: seq[uint32]] + +var MappedMapLow: LowMap +var MappedMapHigh: HighMap +var DisallowedRanges: FullRangeList +var Disallowed: FullSet +var Ignored: FullSet +var Deviation: LowMap + +proc loadIdnaData() = + template add_map(i: uint32, str: string) = + if i <= high(uint16): + MappedMapLow.add((uint16(i), str)) + else: + MappedMapHigh.add((i, str)) + template add_disallow(i, j: uint32) = + if i <= high(uint16): + DisallowedRanges.lm.add((uint16(i), uint16(j))) + else: + DisallowedRanges.hm.add((i, j)) + template add_disallow(i: uint32) = + if i <= high(uint16): + Disallowed.lm.add(uint16(i)) + else: + Disallowed.hm.add(i) + template add_ignore(rstart, rend: uint32) = + for i in rstart..rend: + if i <= high(uint16): + Ignored.lm.add(uint16(i)) + else: + Ignored.hm.add(i) + template add_ignore(i: uint32) = + if i <= high(uint16): + Ignored.lm.add(uint16(i)) + else: + Ignored.hm.add(i) + template add_deviation(i: uint32, str: string) = + assert i <= high(uint16) + Deviation.add((uint16(i), str)) + template add(firstcol: string, str: string, temp: untyped) = + if firstcol.contains(".."): + let fcs = firstcol.split("..") + let rstart = uint32(parseHexInt(fcs[0])) + let rend = uint32(parseHexInt(fcs[1])) + for i in rstart..rend: + temp(i, str) + else: + temp(uint32(parseHexInt(firstcol)), str) + template add(firstcol: string, temp: untyped) = + if firstcol.contains(".."): + let fcs = firstcol.split("..") + let rstart = uint32(parseHexInt(fcs[0])) + let rend = uint32(parseHexInt(fcs[1])) + temp(rstart, rend) + else: + temp(uint32(parseHexInt(firstcol))) + + var f: File + if not open(f, "res/map/IdnaMappingTable.txt"): + stderr.write("res/map/IdnaMappingTable.txt not found\n") + quit(1) + let s = f.readAll() + for line in s.split('\n'): + if line.len == 0 or line[0] == '#': + continue + var i = 0 + var firstcol = "" + var status = "" + var thirdcol: seq[string] + var fourthcol = "" + + while i < line.len and line[i] notin {'#', ';'}: + if line[i] != ' ': + firstcol &= line[i] + inc i + if line[i] != '#': + inc i + + while i < line.len and line[i] notin {'#', ';'}: + if line[i] != ' ': + status &= line[i] + inc i + if line[i] != '#': + inc i + + var nw = true + while i < line.len and line[i] notin {'#', ';'}: + if line[i] == ' ': + nw = true + else: + if nw: + thirdcol.add("") + nw = false + thirdcol[^1] &= line[i] + inc i + if line[i] != '#': + inc i + + while i < line.len and line[i] notin {'#', ';'}: + if line[i] != ' ': + fourthcol &= line[i] + inc i + + case status + of "mapped", "disallowed_STD3_mapped": + let codepoints = thirdcol + var str = "" + for code in codepoints: + str &= Rune(parseHexInt(code)) + + add(firstcol, str, add_map) + of "deviation": + let codepoints = thirdcol + var str = "" + for code in codepoints: + str &= Rune(parseHexInt(code)) + + add(firstcol, str, add_deviation) + of "valid": + if fourthcol == "NV8" or fourthcol == "XV8": + add(firstcol, add_disallow) + of "disallowed": + add(firstcol, add_disallow) + of "ignored": + add(firstcol, add_ignore) + +type LineWriter = object + s: Stream + line: string + +proc write(writer: var LineWriter, s: string) = + if s.len + writer.line.len > 80: + writer.s.writeLine(writer.line) + writer.line = "" + writer.line &= s + +proc flush(writer: var LineWriter) = + writer.s.writeLine(writer.line) + writer.line = "" + +proc main() = + loadIdnaData() + var writer = LineWriter(s: newFileStream(stdout)) + echo "type Z = cstring" + + echo "const MappedMapLow: array[" & $MappedMapLow.len & + ", tuple[ucs: uint16, mapped: Z]] = [" + for (ucs, s) in MappedMapLow: + writer.write("(" & $ucs & "," & s.escape() & ".Z),") + writer.flush() + echo "]" + echo "" + echo "const MappedMapHigh: array[" & $MappedMapHigh.len & + ", tuple[ucs: uint32, mapped: Z]] = [" + for (ucs, s) in MappedMapHigh: + writer.write("(" & $ucs & "," & s.escape() & ".Z),") + writer.flush() + echo "]" + echo "" + + echo "const DisallowedRangesLow: array[" & $DisallowedRanges.lm.len & + ", tuple[ucs, mapped: uint16]] = [" + for (ucs, mapped) in DisallowedRanges.lm: + writer.write("(" & $ucs & "," & $mapped & "),") + writer.flush() + echo "]" + echo "" + echo "const DisallowedRangesHigh: array[" & $DisallowedRanges.hm.len & + ", tuple[ucs, mapped: uint32]] = [" + for (ucs, mapped) in DisallowedRanges.hm: + writer.write("(" & $ucs & "," & $mapped & "),") + writer.flush() + echo "]" + echo "" + + echo "const DisallowedLow: array[" & $Disallowed.lm.len & ", uint16] = [" + for ucs in Disallowed.lm: + writer.write($ucs & ",") + writer.flush() + echo "]" + echo "" + echo "const DisallowedHigh: array[" & $Disallowed.hm.len & ", uint32] = [" + for ucs in Disallowed.hm: + writer.write($ucs & ",") + writer.flush() + echo "]" + + echo "" + echo "const IgnoredLow: array[" & $Ignored.lm.len & ", uint16] = [" + for ucs in Ignored.lm: + writer.write($ucs & ",") + writer.flush() + echo "]" + echo "" + echo "const IgnoredHigh: array[" & $Ignored.hm.len & ", uint32] = [" + for ucs in Ignored.hm: + writer.write($ucs & ",") + writer.flush() + echo "]" + + echo "" + echo "const Deviation: array[" & $Deviation.len & + ", tuple[ucs: uint16, s: Z]] = [" + for (ucs, s) in Deviation: + writer.write("(" & $ucs & "," & s.escape() & ".Z),") + writer.flush() + echo "]" + +main() diff --git a/res/map/idna_gen.nim b/res/map/idna_gen.nim new file mode 100644 index 00000000..ca19239a --- /dev/null +++ b/res/map/idna_gen.nim @@ -0,0 +1,2419 @@ +type Z = cstring +const MappedMapLow: array[4029, tuple[ucs: uint16, mapped: Z]] = [ +(65,"a".Z),(66,"b".Z),(67,"c".Z),(68,"d".Z),(69,"e".Z),(70,"f".Z),(71,"g".Z), +(72,"h".Z),(73,"i".Z),(74,"j".Z),(75,"k".Z),(76,"l".Z),(77,"m".Z),(78,"n".Z), +(79,"o".Z),(80,"p".Z),(81,"q".Z),(82,"r".Z),(83,"s".Z),(84,"t".Z),(85,"u".Z), +(86,"v".Z),(87,"w".Z),(88,"x".Z),(89,"y".Z),(90,"z".Z),(160," ".Z), +(168," \xCC\x88".Z),(170,"a".Z),(175," \xCC\x84".Z),(178,"2".Z),(179,"3".Z), +(180," \xCC\x81".Z),(181,"\xCE\xBC".Z),(184," \xCC\xA7".Z),(185,"1".Z), +(186,"o".Z),(188,"1\xE2\x81\x844".Z),(189,"1\xE2\x81\x842".Z), +(190,"3\xE2\x81\x844".Z),(192,"\xC3\xA0".Z),(193,"\xC3\xA1".Z), +(194,"\xC3\xA2".Z),(195,"\xC3\xA3".Z),(196,"\xC3\xA4".Z),(197,"\xC3\xA5".Z), +(198,"\xC3\xA6".Z),(199,"\xC3\xA7".Z),(200,"\xC3\xA8".Z),(201,"\xC3\xA9".Z), +(202,"\xC3\xAA".Z),(203,"\xC3\xAB".Z),(204,"\xC3\xAC".Z),(205,"\xC3\xAD".Z), +(206,"\xC3\xAE".Z),(207,"\xC3\xAF".Z),(208,"\xC3\xB0".Z),(209,"\xC3\xB1".Z), +(210,"\xC3\xB2".Z),(211,"\xC3\xB3".Z),(212,"\xC3\xB4".Z),(213,"\xC3\xB5".Z), +(214,"\xC3\xB6".Z),(216,"\xC3\xB8".Z),(217,"\xC3\xB9".Z),(218,"\xC3\xBA".Z), +(219,"\xC3\xBB".Z),(220,"\xC3\xBC".Z),(221,"\xC3\xBD".Z),(222,"\xC3\xBE".Z), +(256,"\xC4\x81".Z),(258,"\xC4\x83".Z),(260,"\xC4\x85".Z),(262,"\xC4\x87".Z), +(264,"\xC4\x89".Z),(266,"\xC4\x8B".Z),(268,"\xC4\x8D".Z),(270,"\xC4\x8F".Z), +(272,"\xC4\x91".Z),(274,"\xC4\x93".Z),(276,"\xC4\x95".Z),(278,"\xC4\x97".Z), +(280,"\xC4\x99".Z),(282,"\xC4\x9B".Z),(284,"\xC4\x9D".Z),(286,"\xC4\x9F".Z), +(288,"\xC4\xA1".Z),(290,"\xC4\xA3".Z),(292,"\xC4\xA5".Z),(294,"\xC4\xA7".Z), +(296,"\xC4\xA9".Z),(298,"\xC4\xAB".Z),(300,"\xC4\xAD".Z),(302,"\xC4\xAF".Z), +(304,"i\xCC\x87".Z),(306,"ij".Z),(307,"ij".Z),(308,"\xC4\xB5".Z), +(310,"\xC4\xB7".Z),(313,"\xC4\xBA".Z),(315,"\xC4\xBC".Z),(317,"\xC4\xBE".Z), +(319,"l\xC2\xB7".Z),(320,"l\xC2\xB7".Z),(321,"\xC5\x82".Z),(323,"\xC5\x84".Z), +(325,"\xC5\x86".Z),(327,"\xC5\x88".Z),(329,"\xCA\xBCn".Z),(330,"\xC5\x8B".Z), +(332,"\xC5\x8D".Z),(334,"\xC5\x8F".Z),(336,"\xC5\x91".Z),(338,"\xC5\x93".Z), +(340,"\xC5\x95".Z),(342,"\xC5\x97".Z),(344,"\xC5\x99".Z),(346,"\xC5\x9B".Z), +(348,"\xC5\x9D".Z),(350,"\xC5\x9F".Z),(352,"\xC5\xA1".Z),(354,"\xC5\xA3".Z), +(356,"\xC5\xA5".Z),(358,"\xC5\xA7".Z),(360,"\xC5\xA9".Z),(362,"\xC5\xAB".Z), +(364,"\xC5\xAD".Z),(366,"\xC5\xAF".Z),(368,"\xC5\xB1".Z),(370,"\xC5\xB3".Z), +(372,"\xC5\xB5".Z),(374,"\xC5\xB7".Z),(376,"\xC3\xBF".Z),(377,"\xC5\xBA".Z), +(379,"\xC5\xBC".Z),(381,"\xC5\xBE".Z),(383,"s".Z),(385,"\xC9\x93".Z), +(386,"\xC6\x83".Z),(388,"\xC6\x85".Z),(390,"\xC9\x94".Z),(391,"\xC6\x88".Z), +(393,"\xC9\x96".Z),(394,"\xC9\x97".Z),(395,"\xC6\x8C".Z),(398,"\xC7\x9D".Z), +(399,"\xC9\x99".Z),(400,"\xC9\x9B".Z),(401,"\xC6\x92".Z),(403,"\xC9\xA0".Z), +(404,"\xC9\xA3".Z),(406,"\xC9\xA9".Z),(407,"\xC9\xA8".Z),(408,"\xC6\x99".Z), +(412,"\xC9\xAF".Z),(413,"\xC9\xB2".Z),(415,"\xC9\xB5".Z),(416,"\xC6\xA1".Z), +(418,"\xC6\xA3".Z),(420,"\xC6\xA5".Z),(422,"\xCA\x80".Z),(423,"\xC6\xA8".Z), +(425,"\xCA\x83".Z),(428,"\xC6\xAD".Z),(430,"\xCA\x88".Z),(431,"\xC6\xB0".Z), +(433,"\xCA\x8A".Z),(434,"\xCA\x8B".Z),(435,"\xC6\xB4".Z),(437,"\xC6\xB6".Z), +(439,"\xCA\x92".Z),(440,"\xC6\xB9".Z),(444,"\xC6\xBD".Z),(452,"d\xC5\xBE".Z), +(453,"d\xC5\xBE".Z),(454,"d\xC5\xBE".Z),(455,"lj".Z),(456,"lj".Z),(457,"lj".Z), +(458,"nj".Z),(459,"nj".Z),(460,"nj".Z),(461,"\xC7\x8E".Z),(463,"\xC7\x90".Z), +(465,"\xC7\x92".Z),(467,"\xC7\x94".Z),(469,"\xC7\x96".Z),(471,"\xC7\x98".Z), +(473,"\xC7\x9A".Z),(475,"\xC7\x9C".Z),(478,"\xC7\x9F".Z),(480,"\xC7\xA1".Z), +(482,"\xC7\xA3".Z),(484,"\xC7\xA5".Z),(486,"\xC7\xA7".Z),(488,"\xC7\xA9".Z), +(490,"\xC7\xAB".Z),(492,"\xC7\xAD".Z),(494,"\xC7\xAF".Z),(497,"dz".Z), +(498,"dz".Z),(499,"dz".Z),(500,"\xC7\xB5".Z),(502,"\xC6\x95".Z), +(503,"\xC6\xBF".Z),(504,"\xC7\xB9".Z),(506,"\xC7\xBB".Z),(508,"\xC7\xBD".Z), +(510,"\xC7\xBF".Z),(512,"\xC8\x81".Z),(514,"\xC8\x83".Z),(516,"\xC8\x85".Z), +(518,"\xC8\x87".Z),(520,"\xC8\x89".Z),(522,"\xC8\x8B".Z),(524,"\xC8\x8D".Z), +(526,"\xC8\x8F".Z),(528,"\xC8\x91".Z),(530,"\xC8\x93".Z),(532,"\xC8\x95".Z), +(534,"\xC8\x97".Z),(536,"\xC8\x99".Z),(538,"\xC8\x9B".Z),(540,"\xC8\x9D".Z), +(542,"\xC8\x9F".Z),(544,"\xC6\x9E".Z),(546,"\xC8\xA3".Z),(548,"\xC8\xA5".Z), +(550,"\xC8\xA7".Z),(552,"\xC8\xA9".Z),(554,"\xC8\xAB".Z),(556,"\xC8\xAD".Z), +(558,"\xC8\xAF".Z),(560,"\xC8\xB1".Z),(562,"\xC8\xB3".Z),(570,"\xE2\xB1\xA5".Z), +(571,"\xC8\xBC".Z),(573,"\xC6\x9A".Z),(574,"\xE2\xB1\xA6".Z),(577,"\xC9\x82".Z), +(579,"\xC6\x80".Z),(580,"\xCA\x89".Z),(581,"\xCA\x8C".Z),(582,"\xC9\x87".Z), +(584,"\xC9\x89".Z),(586,"\xC9\x8B".Z),(588,"\xC9\x8D".Z),(590,"\xC9\x8F".Z), +(688,"h".Z),(689,"\xC9\xA6".Z),(690,"j".Z),(691,"r".Z),(692,"\xC9\xB9".Z), +(693,"\xC9\xBB".Z),(694,"\xCA\x81".Z),(695,"w".Z),(696,"y".Z), +(728," \xCC\x86".Z),(729," \xCC\x87".Z),(730," \xCC\x8A".Z),(731," \xCC\xA8".Z), +(732," \xCC\x83".Z),(733," \xCC\x8B".Z),(736,"\xC9\xA3".Z),(737,"l".Z), +(738,"s".Z),(739,"x".Z),(740,"\xCA\x95".Z),(832,"\xCC\x80".Z), +(833,"\xCC\x81".Z),(835,"\xCC\x93".Z),(836,"\xCC\x88\xCC\x81".Z), +(837,"\xCE\xB9".Z),(880,"\xCD\xB1".Z),(882,"\xCD\xB3".Z),(884,"\xCA\xB9".Z), +(886,"\xCD\xB7".Z),(890," \xCE\xB9".Z),(894,";".Z),(895,"\xCF\xB3".Z), +(900," \xCC\x81".Z),(901," \xCC\x88\xCC\x81".Z),(902,"\xCE\xAC".Z), +(903,"\xC2\xB7".Z),(904,"\xCE\xAD".Z),(905,"\xCE\xAE".Z),(906,"\xCE\xAF".Z), +(908,"\xCF\x8C".Z),(910,"\xCF\x8D".Z),(911,"\xCF\x8E".Z),(913,"\xCE\xB1".Z), +(914,"\xCE\xB2".Z),(915,"\xCE\xB3".Z),(916,"\xCE\xB4".Z),(917,"\xCE\xB5".Z), +(918,"\xCE\xB6".Z),(919,"\xCE\xB7".Z),(920,"\xCE\xB8".Z),(921,"\xCE\xB9".Z), +(922,"\xCE\xBA".Z),(923,"\xCE\xBB".Z),(924,"\xCE\xBC".Z),(925,"\xCE\xBD".Z), +(926,"\xCE\xBE".Z),(927,"\xCE\xBF".Z),(928,"\xCF\x80".Z),(929,"\xCF\x81".Z), +(931,"\xCF\x83".Z),(932,"\xCF\x84".Z),(933,"\xCF\x85".Z),(934,"\xCF\x86".Z), +(935,"\xCF\x87".Z),(936,"\xCF\x88".Z),(937,"\xCF\x89".Z),(938,"\xCF\x8A".Z), +(939,"\xCF\x8B".Z),(975,"\xCF\x97".Z),(976,"\xCE\xB2".Z),(977,"\xCE\xB8".Z), +(978,"\xCF\x85".Z),(979,"\xCF\x8D".Z),(980,"\xCF\x8B".Z),(981,"\xCF\x86".Z), +(982,"\xCF\x80".Z),(984,"\xCF\x99".Z),(986,"\xCF\x9B".Z),(988,"\xCF\x9D".Z), +(990,"\xCF\x9F".Z),(992,"\xCF\xA1".Z),(994,"\xCF\xA3".Z),(996,"\xCF\xA5".Z), +(998,"\xCF\xA7".Z),(1000,"\xCF\xA9".Z),(1002,"\xCF\xAB".Z),(1004,"\xCF\xAD".Z), +(1006,"\xCF\xAF".Z),(1008,"\xCE\xBA".Z),(1009,"\xCF\x81".Z),(1010,"\xCF\x83".Z), +(1012,"\xCE\xB8".Z),(1013,"\xCE\xB5".Z),(1015,"\xCF\xB8".Z),(1017,"\xCF\x83".Z), +(1018,"\xCF\xBB".Z),(1021,"\xCD\xBB".Z),(1022,"\xCD\xBC".Z),(1023,"\xCD\xBD".Z), +(1024,"\xD1\x90".Z),(1025,"\xD1\x91".Z),(1026,"\xD1\x92".Z),(1027,"\xD1\x93".Z), +(1028,"\xD1\x94".Z),(1029,"\xD1\x95".Z),(1030,"\xD1\x96".Z),(1031,"\xD1\x97".Z), +(1032,"\xD1\x98".Z),(1033,"\xD1\x99".Z),(1034,"\xD1\x9A".Z),(1035,"\xD1\x9B".Z), +(1036,"\xD1\x9C".Z),(1037,"\xD1\x9D".Z),(1038,"\xD1\x9E".Z),(1039,"\xD1\x9F".Z), +(1040,"\xD0\xB0".Z),(1041,"\xD0\xB1".Z),(1042,"\xD0\xB2".Z),(1043,"\xD0\xB3".Z), +(1044,"\xD0\xB4".Z),(1045,"\xD0\xB5".Z),(1046,"\xD0\xB6".Z),(1047,"\xD0\xB7".Z), +(1048,"\xD0\xB8".Z),(1049,"\xD0\xB9".Z),(1050,"\xD0\xBA".Z),(1051,"\xD0\xBB".Z), +(1052,"\xD0\xBC".Z),(1053,"\xD0\xBD".Z),(1054,"\xD0\xBE".Z),(1055,"\xD0\xBF".Z), +(1056,"\xD1\x80".Z),(1057,"\xD1\x81".Z),(1058,"\xD1\x82".Z),(1059,"\xD1\x83".Z), +(1060,"\xD1\x84".Z),(1061,"\xD1\x85".Z),(1062,"\xD1\x86".Z),(1063,"\xD1\x87".Z), +(1064,"\xD1\x88".Z),(1065,"\xD1\x89".Z),(1066,"\xD1\x8A".Z),(1067,"\xD1\x8B".Z), +(1068,"\xD1\x8C".Z),(1069,"\xD1\x8D".Z),(1070,"\xD1\x8E".Z),(1071,"\xD1\x8F".Z), +(1120,"\xD1\xA1".Z),(1122,"\xD1\xA3".Z),(1124,"\xD1\xA5".Z),(1126,"\xD1\xA7".Z), +(1128,"\xD1\xA9".Z),(1130,"\xD1\xAB".Z),(1132,"\xD1\xAD".Z),(1134,"\xD1\xAF".Z), +(1136,"\xD1\xB1".Z),(1138,"\xD1\xB3".Z),(1140,"\xD1\xB5".Z),(1142,"\xD1\xB7".Z), +(1144,"\xD1\xB9".Z),(1146,"\xD1\xBB".Z),(1148,"\xD1\xBD".Z),(1150,"\xD1\xBF".Z), +(1152,"\xD2\x81".Z),(1162,"\xD2\x8B".Z),(1164,"\xD2\x8D".Z),(1166,"\xD2\x8F".Z), +(1168,"\xD2\x91".Z),(1170,"\xD2\x93".Z),(1172,"\xD2\x95".Z),(1174,"\xD2\x97".Z), +(1176,"\xD2\x99".Z),(1178,"\xD2\x9B".Z),(1180,"\xD2\x9D".Z),(1182,"\xD2\x9F".Z), +(1184,"\xD2\xA1".Z),(1186,"\xD2\xA3".Z),(1188,"\xD2\xA5".Z),(1190,"\xD2\xA7".Z), +(1192,"\xD2\xA9".Z),(1194,"\xD2\xAB".Z),(1196,"\xD2\xAD".Z),(1198,"\xD2\xAF".Z), +(1200,"\xD2\xB1".Z),(1202,"\xD2\xB3".Z),(1204,"\xD2\xB5".Z),(1206,"\xD2\xB7".Z), +(1208,"\xD2\xB9".Z),(1210,"\xD2\xBB".Z),(1212,"\xD2\xBD".Z),(1214,"\xD2\xBF".Z), +(1217,"\xD3\x82".Z),(1219,"\xD3\x84".Z),(1221,"\xD3\x86".Z),(1223,"\xD3\x88".Z), +(1225,"\xD3\x8A".Z),(1227,"\xD3\x8C".Z),(1229,"\xD3\x8E".Z),(1232,"\xD3\x91".Z), +(1234,"\xD3\x93".Z),(1236,"\xD3\x95".Z),(1238,"\xD3\x97".Z),(1240,"\xD3\x99".Z), +(1242,"\xD3\x9B".Z),(1244,"\xD3\x9D".Z),(1246,"\xD3\x9F".Z),(1248,"\xD3\xA1".Z), +(1250,"\xD3\xA3".Z),(1252,"\xD3\xA5".Z),(1254,"\xD3\xA7".Z),(1256,"\xD3\xA9".Z), +(1258,"\xD3\xAB".Z),(1260,"\xD3\xAD".Z),(1262,"\xD3\xAF".Z),(1264,"\xD3\xB1".Z), +(1266,"\xD3\xB3".Z),(1268,"\xD3\xB5".Z),(1270,"\xD3\xB7".Z),(1272,"\xD3\xB9".Z), +(1274,"\xD3\xBB".Z),(1276,"\xD3\xBD".Z),(1278,"\xD3\xBF".Z),(1280,"\xD4\x81".Z), +(1282,"\xD4\x83".Z),(1284,"\xD4\x85".Z),(1286,"\xD4\x87".Z),(1288,"\xD4\x89".Z), +(1290,"\xD4\x8B".Z),(1292,"\xD4\x8D".Z),(1294,"\xD4\x8F".Z),(1296,"\xD4\x91".Z), +(1298,"\xD4\x93".Z),(1300,"\xD4\x95".Z),(1302,"\xD4\x97".Z),(1304,"\xD4\x99".Z), +(1306,"\xD4\x9B".Z),(1308,"\xD4\x9D".Z),(1310,"\xD4\x9F".Z),(1312,"\xD4\xA1".Z), +(1314,"\xD4\xA3".Z),(1316,"\xD4\xA5".Z),(1318,"\xD4\xA7".Z),(1320,"\xD4\xA9".Z), +(1322,"\xD4\xAB".Z),(1324,"\xD4\xAD".Z),(1326,"\xD4\xAF".Z),(1329,"\xD5\xA1".Z), +(1330,"\xD5\xA2".Z),(1331,"\xD5\xA3".Z),(1332,"\xD5\xA4".Z),(1333,"\xD5\xA5".Z), +(1334,"\xD5\xA6".Z),(1335,"\xD5\xA7".Z),(1336,"\xD5\xA8".Z),(1337,"\xD5\xA9".Z), +(1338,"\xD5\xAA".Z),(1339,"\xD5\xAB".Z),(1340,"\xD5\xAC".Z),(1341,"\xD5\xAD".Z), +(1342,"\xD5\xAE".Z),(1343,"\xD5\xAF".Z),(1344,"\xD5\xB0".Z),(1345,"\xD5\xB1".Z), +(1346,"\xD5\xB2".Z),(1347,"\xD5\xB3".Z),(1348,"\xD5\xB4".Z),(1349,"\xD5\xB5".Z), +(1350,"\xD5\xB6".Z),(1351,"\xD5\xB7".Z),(1352,"\xD5\xB8".Z),(1353,"\xD5\xB9".Z), +(1354,"\xD5\xBA".Z),(1355,"\xD5\xBB".Z),(1356,"\xD5\xBC".Z),(1357,"\xD5\xBD".Z), +(1358,"\xD5\xBE".Z),(1359,"\xD5\xBF".Z),(1360,"\xD6\x80".Z),(1361,"\xD6\x81".Z), +(1362,"\xD6\x82".Z),(1363,"\xD6\x83".Z),(1364,"\xD6\x84".Z),(1365,"\xD6\x85".Z), +(1366,"\xD6\x86".Z),(1415,"\xD5\xA5\xD6\x82".Z),(1653,"\xD8\xA7\xD9\xB4".Z), +(1654,"\xD9\x88\xD9\xB4".Z),(1655,"\xDB\x87\xD9\xB4".Z), +(1656,"\xD9\x8A\xD9\xB4".Z),(2392,"\xE0\xA4\x95\xE0\xA4\xBC".Z), +(2393,"\xE0\xA4\x96\xE0\xA4\xBC".Z),(2394,"\xE0\xA4\x97\xE0\xA4\xBC".Z), +(2395,"\xE0\xA4\x9C\xE0\xA4\xBC".Z),(2396,"\xE0\xA4\xA1\xE0\xA4\xBC".Z), +(2397,"\xE0\xA4\xA2\xE0\xA4\xBC".Z),(2398,"\xE0\xA4\xAB\xE0\xA4\xBC".Z), +(2399,"\xE0\xA4\xAF\xE0\xA4\xBC".Z),(2524,"\xE0\xA6\xA1\xE0\xA6\xBC".Z), +(2525,"\xE0\xA6\xA2\xE0\xA6\xBC".Z),(2527,"\xE0\xA6\xAF\xE0\xA6\xBC".Z), +(2611,"\xE0\xA8\xB2\xE0\xA8\xBC".Z),(2614,"\xE0\xA8\xB8\xE0\xA8\xBC".Z), +(2649,"\xE0\xA8\x96\xE0\xA8\xBC".Z),(2650,"\xE0\xA8\x97\xE0\xA8\xBC".Z), +(2651,"\xE0\xA8\x9C\xE0\xA8\xBC".Z),(2654,"\xE0\xA8\xAB\xE0\xA8\xBC".Z), +(2908,"\xE0\xAC\xA1\xE0\xAC\xBC".Z),(2909,"\xE0\xAC\xA2\xE0\xAC\xBC".Z), +(3635,"\xE0\xB9\x8D\xE0\xB8\xB2".Z),(3763,"\xE0\xBB\x8D\xE0\xBA\xB2".Z), +(3804,"\xE0\xBA\xAB\xE0\xBA\x99".Z),(3805,"\xE0\xBA\xAB\xE0\xBA\xA1".Z), +(3852,"\xE0\xBC\x8B".Z),(3907,"\xE0\xBD\x82\xE0\xBE\xB7".Z), +(3917,"\xE0\xBD\x8C\xE0\xBE\xB7".Z),(3922,"\xE0\xBD\x91\xE0\xBE\xB7".Z), +(3927,"\xE0\xBD\x96\xE0\xBE\xB7".Z),(3932,"\xE0\xBD\x9B\xE0\xBE\xB7".Z), +(3945,"\xE0\xBD\x80\xE0\xBE\xB5".Z),(3955,"\xE0\xBD\xB1\xE0\xBD\xB2".Z), +(3957,"\xE0\xBD\xB1\xE0\xBD\xB4".Z),(3958,"\xE0\xBE\xB2\xE0\xBE\x80".Z), +(3959,"\xE0\xBE\xB2\xE0\xBD\xB1\xE0\xBE\x80".Z), +(3960,"\xE0\xBE\xB3\xE0\xBE\x80".Z), +(3961,"\xE0\xBE\xB3\xE0\xBD\xB1\xE0\xBE\x80".Z), +(3969,"\xE0\xBD\xB1\xE0\xBE\x80".Z),(3987,"\xE0\xBE\x92\xE0\xBE\xB7".Z), +(3997,"\xE0\xBE\x9C\xE0\xBE\xB7".Z),(4002,"\xE0\xBE\xA1\xE0\xBE\xB7".Z), +(4007,"\xE0\xBE\xA6\xE0\xBE\xB7".Z),(4012,"\xE0\xBE\xAB\xE0\xBE\xB7".Z), +(4025,"\xE0\xBE\x90\xE0\xBE\xB5".Z),(4295,"\xE2\xB4\xA7".Z), +(4301,"\xE2\xB4\xAD".Z),(4348,"\xE1\x83\x9C".Z),(5112,"\xE1\x8F\xB0".Z), +(5113,"\xE1\x8F\xB1".Z),(5114,"\xE1\x8F\xB2".Z),(5115,"\xE1\x8F\xB3".Z), +(5116,"\xE1\x8F\xB4".Z),(5117,"\xE1\x8F\xB5".Z),(7296,"\xD0\xB2".Z), +(7297,"\xD0\xB4".Z),(7298,"\xD0\xBE".Z),(7299,"\xD1\x81".Z),(7300,"\xD1\x82".Z), +(7301,"\xD1\x82".Z),(7302,"\xD1\x8A".Z),(7303,"\xD1\xA3".Z), +(7304,"\xEA\x99\x8B".Z),(7312,"\xE1\x83\x90".Z),(7313,"\xE1\x83\x91".Z), +(7314,"\xE1\x83\x92".Z),(7315,"\xE1\x83\x93".Z),(7316,"\xE1\x83\x94".Z), +(7317,"\xE1\x83\x95".Z),(7318,"\xE1\x83\x96".Z),(7319,"\xE1\x83\x97".Z), +(7320,"\xE1\x83\x98".Z),(7321,"\xE1\x83\x99".Z),(7322,"\xE1\x83\x9A".Z), +(7323,"\xE1\x83\x9B".Z),(7324,"\xE1\x83\x9C".Z),(7325,"\xE1\x83\x9D".Z), +(7326,"\xE1\x83\x9E".Z),(7327,"\xE1\x83\x9F".Z),(7328,"\xE1\x83\xA0".Z), +(7329,"\xE1\x83\xA1".Z),(7330,"\xE1\x83\xA2".Z),(7331,"\xE1\x83\xA3".Z), +(7332,"\xE1\x83\xA4".Z),(7333,"\xE1\x83\xA5".Z),(7334,"\xE1\x83\xA6".Z), +(7335,"\xE1\x83\xA7".Z),(7336,"\xE1\x83\xA8".Z),(7337,"\xE1\x83\xA9".Z), +(7338,"\xE1\x83\xAA".Z),(7339,"\xE1\x83\xAB".Z),(7340,"\xE1\x83\xAC".Z), +(7341,"\xE1\x83\xAD".Z),(7342,"\xE1\x83\xAE".Z),(7343,"\xE1\x83\xAF".Z), +(7344,"\xE1\x83\xB0".Z),(7345,"\xE1\x83\xB1".Z),(7346,"\xE1\x83\xB2".Z), +(7347,"\xE1\x83\xB3".Z),(7348,"\xE1\x83\xB4".Z),(7349,"\xE1\x83\xB5".Z), +(7350,"\xE1\x83\xB6".Z),(7351,"\xE1\x83\xB7".Z),(7352,"\xE1\x83\xB8".Z), +(7353,"\xE1\x83\xB9".Z),(7354,"\xE1\x83\xBA".Z),(7357,"\xE1\x83\xBD".Z), +(7358,"\xE1\x83\xBE".Z),(7359,"\xE1\x83\xBF".Z),(7468,"a".Z), +(7469,"\xC3\xA6".Z),(7470,"b".Z),(7472,"d".Z),(7473,"e".Z),(7474,"\xC7\x9D".Z), +(7475,"g".Z),(7476,"h".Z),(7477,"i".Z),(7478,"j".Z),(7479,"k".Z),(7480,"l".Z), +(7481,"m".Z),(7482,"n".Z),(7484,"o".Z),(7485,"\xC8\xA3".Z),(7486,"p".Z), +(7487,"r".Z),(7488,"t".Z),(7489,"u".Z),(7490,"w".Z),(7491,"a".Z), +(7492,"\xC9\x90".Z),(7493,"\xC9\x91".Z),(7494,"\xE1\xB4\x82".Z),(7495,"b".Z), +(7496,"d".Z),(7497,"e".Z),(7498,"\xC9\x99".Z),(7499,"\x |