diff options
author | bptato <nincsnevem662@gmail.com> | 2024-01-04 18:54:08 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-01-04 18:56:48 +0100 |
commit | d4409baee1a510bf3361820cbdf4118ed09baffd (patch) | |
tree | a579e85083fcdee24b262a9ff1b328921c2a3290 /res | |
parent | c9337674db699951918225cddc56fcf75f313a15 (diff) | |
download | chawan-d4409baee1a510bf3361820cbdf4118ed09baffd.tar.gz |
charwidth: use pre-generated map file
Also for reducing compilation time.
Diffstat (limited to 'res')
-rw-r--r-- | res/gencharwidth.nim | 202 | ||||
-rw-r--r-- | res/genidna.nim | 1 | ||||
-rw-r--r-- | res/map/charwidth_gen.nim | 196 |
3 files changed, 399 insertions, 0 deletions
diff --git a/res/gencharwidth.nim b/res/gencharwidth.nim new file mode 100644 index 00000000..9e6d25a7 --- /dev/null +++ b/res/gencharwidth.nim @@ -0,0 +1,202 @@ +import std/streams +import std/strutils + +import utils/charcategory +import utils/proptable + +var DoubleWidthRanges: seq[(uint32, uint32)] +var DoubleWidthAmbiguousRanges: seq[(uint32, uint32)] +#var HalfWidthRanges: seq[(uint32, uint32)] + +# Combining chars from https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c +# +# The following two functions define the column width of an ISO 10646 +# character as follows: +# +# - The null character (U+0000) has a column width of 0. +# +# - Other C0/C1 control characters and DEL will lead to a return value of 0 +# +# - Non-spacing and enclosing combining characters (general category code Mn +# or Me in the Unicode database) have a column width of 0. +# +# - SOFT HYPHEN (U+00AD) has a column width of 1. +# +# - Other format characters (general category code Cf in the Unicode +# database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. +# +# - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) have a +# column width of 0. +# +# - Spacing characters in the East Asian Wide (W) or East Asian Full-width +# (F) category as defined in Unicode Technical Report #11 have a column +# width of 2. +# +# - All remaining characters (including all printable ISO 8859-1 and WGL4 +# characters, Unicode control characters, etc.) have a column width of 1. +# + +# sorted list of non-overlapping intervals of non-spacing characters generated +# by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" +const Combining = [ + (0x0300u32, 0x036Fu32), (0x0483u32, 0x0486u32), (0x0488u32, 0x0489u32), + (0x0591u32, 0x05BDu32), (0x05BFu32, 0x05BFu32), (0x05C1u32, 0x05C2u32), + (0x05C4u32, 0x05C5u32), (0x05C7u32, 0x05C7u32), (0x0600u32, 0x0603u32), + (0x0610u32, 0x0615u32), (0x064Bu32, 0x065Eu32), (0x0670u32, 0x0670u32), + (0x06D6u32, 0x06E4u32), (0x06E7u32, 0x06E8u32), (0x06EAu32, 0x06EDu32), + (0x070Fu32, 0x070Fu32), (0x0711u32, 0x0711u32), (0x0730u32, 0x074Au32), + (0x07A6u32, 0x07B0u32), (0x07EBu32, 0x07F3u32), (0x0901u32, 0x0902u32), + (0x093Cu32, 0x093Cu32), (0x0941u32, 0x0948u32), (0x094Du32, 0x094Du32), + (0x0951u32, 0x0954u32), (0x0962u32, 0x0963u32), (0x0981u32, 0x0981u32), + (0x09BCu32, 0x09BCu32), (0x09C1u32, 0x09C4u32), (0x09CDu32, 0x09CDu32), + (0x09E2u32, 0x09E3u32), (0x0A01u32, 0x0A02u32), (0x0A3Cu32, 0x0A3Cu32), + (0x0A41u32, 0x0A42u32), (0x0A47u32, 0x0A48u32), (0x0A4Bu32, 0x0A4Du32), + (0x0A70u32, 0x0A71u32), (0x0A81u32, 0x0A82u32), (0x0ABCu32, 0x0ABCu32), + (0x0AC1u32, 0x0AC5u32), (0x0AC7u32, 0x0AC8u32), (0x0ACDu32, 0x0ACDu32), + (0x0AE2u32, 0x0AE3u32), (0x0B01u32, 0x0B01u32), (0x0B3Cu32, 0x0B3Cu32), + (0x0B3Fu32, 0x0B3Fu32), (0x0B41u32, 0x0B43u32), (0x0B4Du32, 0x0B4Du32), + (0x0B56u32, 0x0B56u32), (0x0B82u32, 0x0B82u32), (0x0BC0u32, 0x0BC0u32), + (0x0BCDu32, 0x0BCDu32), (0x0C3Eu32, 0x0C40u32), (0x0C46u32, 0x0C48u32), + (0x0C4Au32, 0x0C4Du32), (0x0C55u32, 0x0C56u32), (0x0CBCu32, 0x0CBCu32), + (0x0CBFu32, 0x0CBFu32), (0x0CC6u32, 0x0CC6u32), (0x0CCCu32, 0x0CCDu32), + (0x0CE2u32, 0x0CE3u32), (0x0D41u32, 0x0D43u32), (0x0D4Du32, 0x0D4Du32), + (0x0DCAu32, 0x0DCAu32), (0x0DD2u32, 0x0DD4u32), (0x0DD6u32, 0x0DD6u32), + (0x0E31u32, 0x0E31u32), (0x0E34u32, 0x0E3Au32), (0x0E47u32, 0x0E4Eu32), + (0x0EB1u32, 0x0EB1u32), (0x0EB4u32, 0x0EB9u32), (0x0EBBu32, 0x0EBCu32), + (0x0EC8u32, 0x0ECDu32), (0x0F18u32, 0x0F19u32), (0x0F35u32, 0x0F35u32), + (0x0F37u32, 0x0F37u32), (0x0F39u32, 0x0F39u32), (0x0F71u32, 0x0F7Eu32), + (0x0F80u32, 0x0F84u32), (0x0F86u32, 0x0F87u32), (0x0F90u32, 0x0F97u32), + (0x0F99u32, 0x0FBCu32), (0x0FC6u32, 0x0FC6u32), (0x102Du32, 0x1030u32), + (0x1032u32, 0x1032u32), (0x1036u32, 0x1037u32), (0x1039u32, 0x1039u32), + (0x1058u32, 0x1059u32), (0x1160u32, 0x11FFu32), (0x135Fu32, 0x135Fu32), + (0x1712u32, 0x1714u32), (0x1732u32, 0x1734u32), (0x1752u32, 0x1753u32), + (0x1772u32, 0x1773u32), (0x17B4u32, 0x17B5u32), (0x17B7u32, 0x17BDu32), + (0x17C6u32, 0x17C6u32), (0x17C9u32, 0x17D3u32), (0x17DDu32, 0x17DDu32), + (0x180Bu32, 0x180Du32), (0x18A9u32, 0x18A9u32), (0x1920u32, 0x1922u32), + (0x1927u32, 0x1928u32), (0x1932u32, 0x1932u32), (0x1939u32, 0x193Bu32), + (0x1A17u32, 0x1A18u32), (0x1B00u32, 0x1B03u32), (0x1B34u32, 0x1B34u32), + (0x1B36u32, 0x1B3Au32), (0x1B3Cu32, 0x1B3Cu32), (0x1B42u32, 0x1B42u32), + (0x1B6Bu32, 0x1B73u32), (0x1DC0u32, 0x1DCAu32), (0x1DFEu32, 0x1DFFu32), + (0x200Bu32, 0x200Fu32), (0x202Au32, 0x202Eu32), (0x2060u32, 0x2063u32), + (0x206Au32, 0x206Fu32), (0x20D0u32, 0x20EFu32), (0x302Au32, 0x302Fu32), + (0x3099u32, 0x309Au32), (0xA806u32, 0xA806u32), (0xA80Bu32, 0xA80Bu32), + (0xA825u32, 0xA826u32), (0xFB1Eu32, 0xFB1Eu32), (0xFE00u32, 0xFE0Fu32), + (0xFE20u32, 0xFE23u32), (0xFEFFu32, 0xFEFFu32), (0xFFF9u32, 0xFFFBu32), + (0x10A01u32, 0x10A03u32), (0x10A05u32, 0x10A06u32), (0x10A0Cu32, 0x10A0Fu32), + (0x10A38u32, 0x10A3Au32), (0x10A3Fu32, 0x10A3Fu32), (0x1D167u32, 0x1D169u32), + (0x1D173u32, 0x1D182u32), (0x1D185u32, 0x1D18Bu32), (0x1D1AAu32, 0x1D1ADu32), + (0x1D242u32, 0x1D244u32), (0xE0001u32, 0xE0001u32), (0xE0020u32, 0xE007Fu32), + (0xE0100u32, 0xE01EFu32) +] + +proc loadRanges() = + template add(firstcol: string, res: var seq[(uint32, uint32)]) = + if firstcol.contains(".."): + let fcs = firstcol.split("..") + let rstart = uint32(parseHexInt(fcs[0])) + let rend = uint32(parseHexInt(fcs[1])) + res.add((rstart, rend)) + else: + let cp = uint32(parseHexInt(firstcol)) + res.add((cp, cp)) + var f: File + if not open(f, "res/map/EastAsianWidth.txt"): + stderr.write("res/map/EastAsianWidth.txt not found\n") + quit(1) + let s = f.readAll() + f.close() + for line in s.split('\n'): + if line.len == 0 or line[0] == '#': + continue + var i = 0 + var firstcol = "" + var status = "" + 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 + case status + of "W", "F": add(firstcol, DoubleWidthRanges) + of "A": add(firstcol, DoubleWidthAmbiguousRanges) + #of "H": add(firstcol, HalfWidthRanges) + +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() = + loadRanges() + var DoubleWidthTable = makePropertyTable(DoubleWidthRanges, Combining) + # Control chars return a width of 2, and are displayed as ^{letter}. + for c in Controls: + let u = int(c) + let i = u div (sizeof(int) * 8) + let m = u mod (sizeof(int) * 8) + DoubleWidthTable[i] = DoubleWidthTable[i] or ptint(1 shl m) + let CombiningTable = makePropertyTable(Combining) + + var dwrLen = 0 + for (ucs, mapped) in DoubleWidthRanges: + if ucs > uint16.high: # lower ranges are added to DoubleWidthTable + inc dwrLen + echo "const DoubleWidthRanges: array[" & $dwrLen & + ", tuple[ucs, mapped: uint32]] = [" + var writer = LineWriter(s: newFileStream(stdout)) + for (ucs, mapped) in DoubleWidthRanges: + if ucs > uint16.high: # lower ranges are added to DoubleWidthTable + writer.write("(" & $ucs & "," & $mapped & "),") + writer.flush() + echo "]" + echo "" + + echo "const DoubleWidthAmbiguousRanges: array[" & + $DoubleWidthAmbiguousRanges.len & ", tuple[ucs, mapped: uint32]] = [" + for (ucs, mapped) in DoubleWidthAmbiguousRanges: + writer.write("(" & $ucs & "," & $mapped & "),") + writer.flush() + echo "]" + echo "" + + var cmbLen = 0 + for (ucs, mapped) in Combining: + if ucs > uint16.high: # lower ranges are added to CombiningTable + inc cmbLen + echo "const Combining: array[" & $cmbLen & ", tuple[ucs, mapped: uint32]] = [" + for (ucs, mapped) in Combining: + if ucs > uint16.high: + writer.write("(" & $ucs & "," & $mapped & "),") + writer.flush() + echo "]" + echo "" + + echo "const DoubleWidthTable: PropertyTable = [" + for u in DoubleWidthTable: + writer.write($u & ",") + writer.flush() + echo "]" + echo "" + + echo "const CombiningTable: PropertyTable = [" + for u in CombiningTable: + writer.write($u & ",") + writer.flush() + echo "]" + echo "" + +main() diff --git a/res/genidna.nim b/res/genidna.nim index 772c88d0..bd8e8bf7 100644 --- a/res/genidna.nim +++ b/res/genidna.nim @@ -69,6 +69,7 @@ proc loadIdnaData() = stderr.write("res/map/IdnaMappingTable.txt not found\n") quit(1) let s = f.readAll() + f.close() for line in s.split('\n'): if line.len == 0 or line[0] == '#': continue diff --git a/res/map/charwidth_gen.nim b/res/map/charwidth_gen.nim new file mode 100644 index 00000000..70e650d4 --- /dev/null +++ b/res/map/charwidth_gen.nim @@ -0,0 +1,196 @@ +const DoubleWidthRanges: array[85, tuple[ucs, mapped: uint32]] = [ +(94176,94177),(94178,94178),(94179,94179),(94180,94180),(94192,94193), +(94208,100343),(100352,101119),(101120,101589),(101632,101640),(110576,110579), +(110581,110587),(110589,110590),(110592,110847),(110848,110882),(110898,110898), +(110928,110930),(110933,110933),(110948,110951),(110960,111355),(126980,126980), +(127183,127183),(127374,127374),(127377,127386),(127488,127490),(127504,127547), +(127552,127560),(127568,127569),(127584,127589),(127744,127776),(127789,127797), +(127799,127868),(127870,127891),(127904,127946),(127951,127955),(127968,127984), +(127988,127988),(127992,127994),(127995,127999),(128000,128062),(128064,128064), +(128066,128252),(128255,128317),(128331,128334),(128336,128359),(128378,128378), +(128405,128406),(128420,128420),(128507,128511),(128512,128591),(128640,128709), +(128716,128716),(128720,128722),(128725,128727),(128732,128735),(128747,128748), +(128756,128764),(128992,129003),(129008,129008),(129292,129338),(129340,129349), +(129351,129535),(129648,129660),(129664,129672),(129680,129725),(129727,129733), +(129742,129755),(129760,129768),(129776,129784),(131072,173791),(173792,173823), +(173824,177977),(177978,177983),(177984,178205),(178206,178207),(178208,183969), +(183970,183983),(183984,191456),(191457,194559),(194560,195101),(195102,195103), +(195104,196605),(196608,201546),(201547,201551),(201552,205743),(205744,262141), +] + +const DoubleWidthAmbiguousRanges: array[198, tuple[ucs, mapped: uint32]] = [ +(161,161),(164,164),(167,167),(168,168),(170,170),(173,173),(174,174),(176,176), +(177,177),(178,179),(180,180),(182,183),(184,184),(185,185),(186,186),(188,190), +(191,191),(198,198),(208,208),(215,215),(216,216),(222,225),(230,230),(232,234), +(236,237),(240,240),(242,243),(247,247),(248,250),(252,252),(254,254),(257,257), +(273,273),(275,275),(283,283),(294,295),(299,299),(305,307),(312,312),(319,322), +(324,324),(328,331),(333,333),(338,339),(358,359),(363,363),(462,462),(464,464), +(466,466),(468,468),(470,470),(472,472),(474,474),(476,476),(593,593),(609,609), +(708,708),(711,711),(713,715),(717,717),(720,720),(728,731),(733,733),(735,735), +(768,879),(913,929),(931,937),(945,961),(963,969),(1025,1025),(1040,1103), +(1105,1105),(8208,8208),(8211,8213),(8214,8214),(8216,8216),(8217,8217), +(8220,8220),(8221,8221),(8224,8226),(8228,8231),(8240,8240),(8242,8243), +(8245,8245),(8251,8251),(8254,8254),(8308,8308),(8319,8319),(8321,8324), +(8364,8364),(8451,8451),(8453,8453),(8457,8457),(8467,8467),(8470,8470), +(8481,8482),(8486,8486),(8491,8491),(8531,8532),(8539,8542),(8544,8555), +(8560,8569),(8585,8585),(8592,8596),(8597,8601),(8632,8633),(8658,8658), +(8660,8660),(8679,8679),(8704,8704),(8706,8707),(8711,8712),(8715,8715), +(8719,8719),(8721,8721),(8725,8725),(8730,8730),(8733,8736),(8739,8739), +(8741,8741),(8743,8748),(8750,8750),(8756,8759),(8764,8765),(8776,8776), +(8780,8780),(8786,8786),(8800,8801),(8804,8807),(8810,8811),(8814,8815), +(8834,8835),(8838,8839),(8853,8853),(8857,8857),(8869,8869),(8895,8895), +(8978,8978),(9312,9371),(9372,9449),(9451,9471),(9472,9547),(9552,9587), +(9600,9615),(9618,9621),(9632,9633),(9635,9641),(9650,9651),(9654,9654), +(9655,9655),(9660,9661),(9664,9664),(9665,9665),(9670,9672),(9675,9675), +(9678,9681),(9698,9701),(9711,9711),(9733,9734),(9737,9737),(9742,9743), +(9756,9756),(9758,9758),(9792,9792),(9794,9794),(9824,9825),(9827,9829), +(9831,9834),(9836,9837),(9839,9839),(9886,9887),(9919,9919),(9926,9933), +(9935,9939),(9941,9953),(9955,9955),(9960,9961),(9963,9969),(9972,9972), +(9974,9977),(9979,9980),(9982,9983),(10045,10045),(10102,10111),(11094,11097), +(12872,12879),(57344,63743),(65024,65039),(65533,65533),(127232,127242), +(127248,127277),(127280,127337),(127344,127373),(127375,127376),(127387,127404), +(917760,917999),(983040,1048573),(1048576,1114109), +] + +const Combining: array[13, tuple[ucs, mapped: uint32]] = [ +(68097,68099),(68101,68102),(68108,68111),(68152,68154),(68159,68159), +(119143,119145),(119155,119170),(119173,119179),(119210,119213),(119362,119364), +(917505,917505),(917536,917631),(917760,917999), +] + +const DoubleWidthTable: PropertyTable = [ +-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,201326592,1536,0,0,0,0,0,597504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1610612736, +3145728,0,1048320,-2147483648,524288,1610615810,1065008,606864384,3104,256, +12079104,0,14680064,-2147418112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,402653184,0,2162688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +-67108865,-1,-1,1048575,-1,-1,-1,-1,-1,-1,4194303,268369920,-1,2147483647,-2,-1, +-25165825,-1,-1,-1,-32,-65537,-1,-1,-32769,-1,-1,-65521,2147483647,-1,-65281,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-57345,-1,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,536870911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,67043328,-65536,-524289,3967,0,0,0,0,-2,-1,-1,1,0,0,0,127, +] + +const CombiningTable: PropertyTable = [ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,65535,0,0,0,0,0,0,0,0, +888,0,0,0,0,0,0,0,-131072,-1073741825,182,0,4128783,0,2147481600,65536,0,0, +-4194304,15775,163840,-65536,2047,0,0,131008,0,1046528,0,0,0,0,0,0,0,0,6, +268435456,1974782,12,2,268435456,8222,12,6,268435456,14726,196608,6,268435456, +8638,12,2,-1879048192,4202510,0,4,0,8193,0,0,-1073741824,6307265,0,0, +-1879048192,12352,12,0,0,8206,0,0,0,6030336,0,0,133300224,32640,0,0,468844544, +16128,0,50331648,44040192,0,2147352576,-16842529,536870911,64,0,0,46522368, +50331648,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-2147483648,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1835008,1835008,786432,786432, +0,1068498944,537919040,0,14336,0,0,0,0,512,0,0,0,235143559,0,0,0,0,0,0,25165824, +0,0,0,0,0,0,0,15,399507456,4,1046528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2047, +-1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63488,31744,0,64527,0,0,-65536, +65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,64512,0,0,100663296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,2112,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65535,15,0,0,0,0,0, +-2147483648,0,0,0,0,0,0,0,234881024, +] + |