変換には CP932.txt (unicode.org) のデータを使用しています。
実行環境にテキスト処理の支援がなくとも、十分なリソースがあれば、変換可能な約 8000 文字に対して 65536 個の参照表を用意する方法もアリでしょうが、ここではコンパクトなテーブル参照による変換を目指します。
疎行列の圧縮
まず、入力となる Unicode で有効な値をビット単位の表にしてみます。
上位 8 ビット(256行)、下位 8 ビット(256桁)の表(長いので折りたたみ)
下位 8 ビットは 256 ビットの 16 進表記(ビッグエンディアン)
00: ffffffffffffffffffffffffffffffff000000000180ca000000010000000100
01: 0000000000000000000000000000000000000000000000000000000000000000
02: 0000000000000000000000000000000000000000000000000000000000000000
03: 0000000000000000000000000000000000007fffdfc07fffdfc0000000000000
04: 4000ffffffffffffffff40000000000000000000000000000000000000000000
05: 0000000000000000000000000000000000000000000000000000000000000000
06: 0000000000000000000000000000000000000000000000000000000000000000
07: 0000000000000000000000000000000000000000000000000000000000000000
08: 0000000000000000000000000000000000000000000000000000000000000000
09: 0000000000000000000000000000000000000000000000000000000000000000
0a: 0000000000000000000000000000000000000000000000000000000000000000
0b: 0000000000000000000000000000000000000000000000000000000000000000
0c: 0000000000000000000000000000000000000000000000000000000000000000
0d: 0000000000000000000000000000000000000000000000000000000000000000
0e: 0000000000000000000000000000000000000000000000000000000000000000
0f: 0000000000000000000000000000000000000000000000000000000000000000
10: 0000000000000000000000000000000000000000000000000000000000000000
11: 0000000000000000000000000000000000000000000000000000000000000000
12: 0000000000000000000000000000000000000000000000000000000000000000
13: 0000000000000000000000000000000000000000000000000000000000000000
14: 0000000000000000000000000000000000000000000000000000000000000000
15: 0000000000000000000000000000000000000000000000000000000000000000
16: 0000000000000000000000000000000000000000000000000000000000000000
17: 0000000000000000000000000000000000000000000000000000000000000000
18: 0000000000000000000000000000000000000000000000000000000000000000
19: 0000000000000000000000000000000000000000000000000000000000000000
1a: 0000000000000000000000000000000000000000000000000000000000000000
1b: 0000000000000000000000000000000000000000000000000000000000000000
1c: 0000000000000000000000000000000000000000000000000000000000000000
1d: 0000000000000000000000000000000000000000000000000000000000000000
1e: 0000000000000000000000000000000000000000000000000000000000000000
1f: 0000000000000000000000000000000000000000000000000000000000000000
20: 000084ccc600b010000000000000000000000000000000000000000000000000
21: 100002004010000000000000ffc0ffc00000f000000000000000280000000000
22: b190402785fa0c0400002000c330000033000000040000010000000000000000
23: 0000200000000000000000000000000000000000000000000000000000000000
24: 000000000000000000000000fffff00000000000000000000000000000000000
25: f009999c9c999999201000000000000000000000c000300c0313000000010000
26: 0600000000000000a00000000025000000000000000000000000000000000000
27: 0000000000000000000000000000000000000000000000000000000000000000
28: 0000000000000000000000000000000000000000000000000000000000000000
29: 0000000000000000000000000000000000000000000000000000000000000000
2a: 0000000000000000000000000000000000000000000000000000000000000000
2b: 0000000000000000000000000000000000000000000000000000000000000000
2c: 0000000000000000000000000000000000000000000000000000000000000000
2d: 0000000000000000000000000000000000000000000000000000000000000000
2e: 0000000000000000000000000000000000000000000000000000000000000000
2f: 0000000000000000000000000000000000000000000000000000000000000000
30: f7fffc05000000007ffffffffffffffffffff01e7ffffffffffffffffffffe1e
31: 0000000000000000000000000000000000000000000000000000000000000000
32: 00000000000060400000000000000000000000000f8000000000000000000000
33: 1004088033100210006441000000001e0003000e400000000804000000000000
34: 0000000000000000000000000000000000000000000000000000000000000000
35: 0000000000000000000000000000000000000000000000000000000000000000
36: 0000000000000000000000000000000000000000000000000000000000000000
37: 0000000000000000000000000000000000000000000000000000000000000000
38: 0000000000000000000000000000000000000000000000000000000000000000
39: 0000000000000000000000000000000000000000000000000000000000000000
3a: 0000000000000000000000000000000000000000000000000000000000000000
3b: 0000000000000000000000000000000000000000000000000000000000000000
3c: 0000000000000000000000000000000000000000000000000000000000000000
3d: 0000000000000000000000000000000000000000000000000000000000000000
3e: 0000000000000000000000000000000000000000000000000000000000000000
3f: 0000000000000000000000000000000000000000000000000000000000000000
40: 0000000000000000000000000000000000000000000000000000000000000000
41: 0000000000000000000000000000000000000000000000000000000000000000
42: 0000000000000000000000000000000000000000000000000000000000000000
43: 0000000000000000000000000000000000000000000000000000000000000000
44: 0000000000000000000000000000000000000000000000000000000000000000
45: 0000000000000000000000000000000000000000000000000000000000000000
46: 0000000000000000000000000000000000000000000000000000000000000000
47: 0000000000000000000000000000000000000000000000000000000000000000
48: 0000000000000000000000000000000000000000000000000000000000000000
49: 0000000000000000000000000000000000000000000000000000000000000000
4a: 0000000000000000000000000000000000000000000000000000000000000000
4b: 0000000000000000000000000000000000000000000000000000000000000000
4c: 0000000000000000000000000000000000000000000000000000000000000000
4d: 0000000000000000000000000000000000000000000000000000000000000000
4e: d1f6cfc242a462d9341707c720005002a6fa6cdbee9e9220eb370fc75c06a318
4f: d067c02c00018aec1307d77e0041961912b56ab4c01706013866c9b55c0316a3
50: 06556a637efc0240b3c186280408ae84840448e0000c3d02246546a215060c50
51: e8402ea140202139dffea8282cfe4788a66df744aef8ff060e5c021cc36cc6e6
52: 9bb24d040d6293f0193d0a121c61fc0511c46819927d4c4ad54425d7bb0034e3
53: e7858764d82150f1d7e479aa8243fd91280012a186c6b21030fe0b557cfff3a0
54: 58ffc015825e02dea2e2400100a0d71c8a3ba0082cd9308ee9c0008066c62025
55: 0b018a00000350c28e09130c1000001a9b7000ef01fa82000d00082918000146
56: 02400b9000416a80200a801008b808a083210800a4020a08f08251b29002b065
57: 98d5328903848190a123c0404e60000120d01000b828900093923a0990000968
58: a63004444821cc24c03069e22050a4421400110b009230f2452855cb0c1be17c
59: 207186f8257e618209c3ddb4b5ea1884782412541c8820720250d86806b00211
5a: 504040a984410608c240002022280001000020300000000e6058830052400030
5b: 005802002028a2029400cfbd1e50d4a095dd05fd3e029ec1bf48b8976fda96a3
5c: 6ff75222a88440ffc6b7d402cc0b42400008c80042d853ba05000040c0e58634
5d: 01124ff121400000201ab008004d120029188004200a01ec004cb21657927d16
5e: 32184274041593849d0a0d0178003eff592107288314078070e19235f0c8dbbb
5f: 587ddf9147454d8a44aa534c637cd149fdb8f1c2c0e6194c140c03ce8810c495
60: 0003a65cc7f140207234a465bcfd85005c7c2b3193603e8c070054abd180fb70
61: d2c74431c188890f29be14e53593df022122cae0095a222213fc800012002baf
62: 80eefa374223b891c1d614929082424bb8607f9a0218445c27edf9dcc00f5703
63: 61c8404101910027004d850801d2233090cb2291f5f82c129a41a23050420e20
64: 02051308028c0a2220020080814102a0108034260c56a058650628a0f3096a26
65: 8400008c18390fd3048747c63208ad8031cac1594d1d814c5e192150e7cc4030
66: b36b1c0b8d874e19785121472fc39a2059c243c4a21228cb4940026c8240bdff
67: 90d70f1703be4ba54243d24bfe25f50b0558852ce2411bd0ca23d8a6294b5c13
68: 78001302607028ccfa86f84d11000b0354051915a385d6680af52da1d1032060
69: cc9f207876a08a4500201c6ee0b71dce60224c9881026813513e90c621942055
6a: 24383953707286e40b9000c16210308388068108b02a10907000503328a00030
6b: 0c202205d10021e6114a98517a6118d19a74068208317d3986163a9100191000
6c: 0081591018000983e002852fa0a1b026728cb270601250ff4c68157474a1d000
6d: 08182153047036964c0000681a6b09c0058a165800092488871964c24aba75f8
6e: 05f01475df5f00ea1026029901132203a009828d242123252c585c0600092983
6f: 62415c00b0186083440008990a0788a8ea82410058205440f2000c91c81b5622
70: 455144b70388a002000840801011808c04622040001f10f00091004500004044
71: 0841086842000208034a06482f4a000408a10c410088404250c2ad01870e045b
72: 0204801000aca63f839820d561402846e1002200a10962423a02a150e04c01cc
73: 0020031d0c730b030c03010010a0a5b00950020000403014a0e6220294264482
74: 1740000026623e214000047bb8619202105000032100800400210808b342e380
75: 5c0e54ab1699f1b80a7d487caf759b8123734824141074ce35242cd23040b82b
76: 40540001e90088102388228861e8a2bebb92927a020289e132a4231b5d222892
77: 49d800138e4001a8830000305690004300124002840c925d0104013835471008
78: 20082c00c70028210402000408192828430e55201161042a4630c82001890804
79: 410260400238802ac1c09727a4840121cc27081403229067c05064815b488010
7a: 809609e98002611fb247810070508a6558803781006382211db5746df73582e1
7b: 2ab140d28688164006ddea04050acc2003152def40244880cb5900048e441300
7c: 8104790151300187900d8a818c0814027054a5916d967046a422228ba1012ab2
7d: ae348df8e01bb4613e9b821a7282764400411079b01fedb7013166aec8c92810
7e: 4c7020137212657652342e660364805d30ebba18000000000000000000000000
7f: 00000000000002a0050ecc8181f2a5c037aa082658c322c446282c00c2509058
80: de18a5c840801215022022a36081bb470f5812b4646d68201a0a02764c01488c
81: 27e00030104150420212dc010612c8e1b0a1142c98c094a7a2c450e195a4183a
82: 65eea39b007a17c0810000e52ab3638200142045061d50d40400795b57105870
83: 7e42038810916ec08461a0802000151905621223a0b04404452a12898051eb14
84: 191e1000a068448c02c20110725f456028108849400428d94a74c268000a0809
85: 82005da1420c0404d0f215e010f4010289a0c9580afb80604045840c0c600172
86: 233013202005800100068c2b0110405000381400187182000b560853084f00d2
87: b2e460a804400911005a154192a20a8120040001201110348b10a00080012352
88: 0507460071004250aa0c31567090a507609423422812cd017c010ccd40803cce
89: 2928b00e04300290580c02038a25290353b113a0436930258000202c13000880
8a: b0aab39514245b384280ec12b25ef0482d4c54a2df8ca04b291d223beb1653a2
8b: e90a8b74c2981042404b12b90219e905902ab260000000000000000000000000
8c: 000000000000012142aa8420603800e8246e0886e1ffbb9df9a6503aba24883c
8d: 0db5ba0000000000000000000b14db0044200040108010222019023550b11409
8e: 00e1800700208c0029e8844198002a084d3458404039c00206bd20113010009e
8f: 14683c5d026110d32e4e0109780000000000001b1187e1392c024820267589e4
90: d617df67f10266ca6577fecad5c727adf961400012a144804022001268840504
91: 200024400104a000007e2a80346835802154a10828310ca0c3dfc3bf5f060609
92: 0226cc02004809698cd2c1722b004182948056b8010401400001b540896430f9
93: 220180e6f69b243008940b18800a840a00080b20090e80401280c3864c800080
94: 110098e0401046a04c807032a020850f40000000000000000000000000000000
95: 00000000000000000000000000000100b1717ac0bd84205a112c0e8864000000
96: 0000000840a32011a81d801f3e28b7a406b70ddc91a1ebd8cf5e465830b0a350
97: 8ba7524a0920b0d63ac5664aead448684e158088929418001290100800063611
98: 7689f1a0480c099c021f0d920511d8000000000000a142001a0000192057280e
99: 1468b886c98a00062458e50000000000000003c2048e18084e80e49520066091
9a: 4403304000908102b40605312c7000000000000000848088880158cb32374910
9b: 020000a135e360187c0748a000012c001003730180b6485082616a107880e400
9c: 8aecbc104c07a072038021208100028000000000000000000000000005589a00
9d: 13c2241112b800134a80c04ec819a02001410020085128b06a011040020520e4
9e: 000000720000000000000000000004c540987505066400fb080fe8de84810b5c
9f: 01821400c008001200332801f32823000004040c800000000000000000000000
a0: 0000000000000000000000000000000000000000000000000000000000000000
a1: 0000000000000000000000000000000000000000000000000000000000000000
a2: 0000000000000000000000000000000000000000000000000000000000000000
a3: 0000000000000000000000000000000000000000000000000000000000000000
a4: 0000000000000000000000000000000000000000000000000000000000000000
a5: 0000000000000000000000000000000000000000000000000000000000000000
a6: 0000000000000000000000000000000000000000000000000000000000000000
a7: 0000000000000000000000000000000000000000000000000000000000000000
a8: 0000000000000000000000000000000000000000000000000000000000000000
a9: 0000000000000000000000000000000000000000000000000000000000000000
aa: 0000000000000000000000000000000000000000000000000000000000000000
ab: 0000000000000000000000000000000000000000000000000000000000000000
ac: 0000000000000000000000000000000000000000000000000000000000000000
ad: 0000000000000000000000000000000000000000000000000000000000000000
ae: 0000000000000000000000000000000000000000000000000000000000000000
af: 0000000000000000000000000000000000000000000000000000000000000000
b0: 0000000000000000000000000000000000000000000000000000000000000000
b1: 0000000000000000000000000000000000000000000000000000000000000000
b2: 0000000000000000000000000000000000000000000000000000000000000000
b3: 0000000000000000000000000000000000000000000000000000000000000000
b4: 0000000000000000000000000000000000000000000000000000000000000000
b5: 0000000000000000000000000000000000000000000000000000000000000000
b6: 0000000000000000000000000000000000000000000000000000000000000000
b7: 0000000000000000000000000000000000000000000000000000000000000000
b8: 0000000000000000000000000000000000000000000000000000000000000000
b9: 0000000000000000000000000000000000000000000000000000000000000000
ba: 0000000000000000000000000000000000000000000000000000000000000000
bb: 0000000000000000000000000000000000000000000000000000000000000000
bc: 0000000000000000000000000000000000000000000000000000000000000000
bd: 0000000000000000000000000000000000000000000000000000000000000000
be: 0000000000000000000000000000000000000000000000000000000000000000
bf: 0000000000000000000000000000000000000000000000000000000000000000
c0: 0000000000000000000000000000000000000000000000000000000000000000
c1: 0000000000000000000000000000000000000000000000000000000000000000
c2: 0000000000000000000000000000000000000000000000000000000000000000
c3: 0000000000000000000000000000000000000000000000000000000000000000
c4: 0000000000000000000000000000000000000000000000000000000000000000
c5: 0000000000000000000000000000000000000000000000000000000000000000
c6: 0000000000000000000000000000000000000000000000000000000000000000
c7: 0000000000000000000000000000000000000000000000000000000000000000
c8: 0000000000000000000000000000000000000000000000000000000000000000
c9: 0000000000000000000000000000000000000000000000000000000000000000
ca: 0000000000000000000000000000000000000000000000000000000000000000
cb: 0000000000000000000000000000000000000000000000000000000000000000
cc: 0000000000000000000000000000000000000000000000000000000000000000
cd: 0000000000000000000000000000000000000000000000000000000000000000
ce: 0000000000000000000000000000000000000000000000000000000000000000
cf: 0000000000000000000000000000000000000000000000000000000000000000
d0: 0000000000000000000000000000000000000000000000000000000000000000
d1: 0000000000000000000000000000000000000000000000000000000000000000
d2: 0000000000000000000000000000000000000000000000000000000000000000
d3: 0000000000000000000000000000000000000000000000000000000000000000
d4: 0000000000000000000000000000000000000000000000000000000000000000
d5: 0000000000000000000000000000000000000000000000000000000000000000
d6: 0000000000000000000000000000000000000000000000000000000000000000
d7: 0000000000000000000000000000000000000000000000000000000000000000
d8: 0000000000000000000000000000000000000000000000000000000000000000
d9: 0000000000000000000000000000000000000000000000000000000000000000
da: 0000000000000000000000000000000000000000000000000000000000000000
db: 0000000000000000000000000000000000000000000000000000000000000000
dc: 0000000000000000000000000000000000000000000000000000000000000000
dd: 0000000000000000000000000000000000000000000000000000000000000000
de: 0000000000000000000000000000000000000000000000000000000000000000
df: 0000000000000000000000000000000000000000000000000000000000000000
e0: 0000000000000000000000000000000000000000000000000000000000000000
e1: 0000000000000000000000000000000000000000000000000000000000000000
e2: 0000000000000000000000000000000000000000000000000000000000000000
e3: 0000000000000000000000000000000000000000000000000000000000000000
e4: 0000000000000000000000000000000000000000000000000000000000000000
e5: 0000000000000000000000000000000000000000000000000000000000000000
e6: 0000000000000000000000000000000000000000000000000000000000000000
e7: 0000000000000000000000000000000000000000000000000000000000000000
e8: 0000000000000000000000000000000000000000000000000000000000000000
e9: 0000000000000000000000000000000000000000000000000000000000000000
ea: 0000000000000000000000000000000000000000000000000000000000000000
eb: 0000000000000000000000000000000000000000000000000000000000000000
ec: 0000000000000000000000000000000000000000000000000000000000000000
ed: 0000000000000000000000000000000000000000000000000000000000000000
ee: 0000000000000000000000000000000000000000000000000000000000000000
ef: 0000000000000000000000000000000000000000000000000000000000000000
f0: 0000000000000000000000000000000000000000000000000000000000000000
f1: 0000000000000000000000000000000000000000000000000000000000000000
f2: 0000000000000000000000000000000000000000000000000000000000000000
f3: 0000000000000000000000000000000000000000000000000000000000000000
f4: 0000000000000000000000000000000000000000000000000000000000000000
f5: 0000000000000000000000000000000000000000000000000000000000000000
f6: 0000000000000000000000000000000000000000000000000000000000000000
f7: 0000000000000000000000000000000000000000000000000000000000000000
f8: 0000000000000000000000000000000000000000000000000000000000000000
f9: 0000000000400000000000000000000000000000000000000000000800000000
fa: 0003fffffffc0000000000000000000000000000000000000000000000000000
fb: 0000000000000000000000000000000000000000000000000000000000000000
fc: 0000000000000000000000000000000000000000000000000000000000000000
fd: 0000000000000000000000000000000000000000000000000000000000000000
fe: 0000000000000000000000000000000000000000000000000000000000000000
ff: 7ffffffffffffffffffffffe7fffffffffffffff0000000000000000fc000000
変換可能な文字コードが特に集中している部分は 0x5000 〜 0xA000 付近です。しかし、'0' や 'f' が続いている部分がほぼありません。例えば、"11808c0462" の部分を 8 ビットで区切ると
16進 | ビット列 |
---|---|
11 | 0001 0001 |
80 | 1000 0000 |
8c | 1000 1100 |
04 | 0000 0100 |
62 | 0110 0010 |
なので、変換可能な Unicode 文字はまばらです。
ビット列の "1" (有効な部分)にバイト毎の番号を割り当てて
| 16進 | ビット列 | データ | 番号 |
|:-:|:-:|:-:|:-:|:-:|
| 11 | 0001 0001 | 0001 0001 | 1 |
| 80 | 1000 0000 | 2000 0000 | 2 |
| 8c | 1000 1100 | 3000 3300 | 3 |
| 04 | 0000 0100 | 0000 0400 | 4 |
| 62 | 0110 0010 | 0550 0050 | 5 |
データを二次元の表と考えます。 "0" (無効)の部分は何でもよいので、ずらして重ねると
-1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 所 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
11 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | ||||
80 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | |||||
8c | 3 | 0 | 0 | 0 | 3 | 3 | 0 | 0 | 2 | ||||
04 | 0 | 0 | 0 | 0 | 0 | 4 | 4 | ||||||
62 | 0 | 5 | 5 | 0 | 0 | 0 | 5 | 0 | 0 | -1 | |||
重 | 5 | 5 | 3 | 2 | 1 | 5 | 3 | 3 | 1 | 4 |
みっちり詰まった「重」が出来上がります。これと「所」を使えば「ビット列」が再現できます。この方法を応用します。
サンプル プログラム
UCS2中のシフトJISフラグ(256×256)に対応する参照表の変数は
- UxCP932_VALID_HI_TABLE
- UxCP932_VALID_LO_TABLE
コード変換は 4096x16(上位 12 ビット、下位 4 ビット)になっていて、対応する参照表の変数は
- UxCP932_SPARSE_HI_TABLE
- インデックスは UxCP932_VALID_HI_TABLE を流用
- UxCP932_SPARSE_LO_TABLE
です。テーブルの構造は関数を読んでください。
CP932への変換表(Python)
UxCP932_VALID_HI_TABLE = [
+1, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11, 0, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, 0, 0, 0, 0, 98,
]
UxCP932_VALID_LO_TABLE = [
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00530180, 0x00800000, 0x00800000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffe0000, 0xfffe03fb, 0x000003fb, 0x00000000,
0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x33210000, 0x080d0063, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00400008, 0x00000802, 0x00000000, 0x03ff03ff, 0x000f0000, 0x00000000, 0x00140000, 0x00000000,
0xe402098d, 0x20305fa1, 0x00040000, 0x00000cc3, 0x000000cc, 0x80000020, 0x00000000, 0x00000000,
0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x000fffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x3999900f, 0x99999939, 0x00000804, 0x00000000, 0x00000000, 0x300c0003, 0x0000c8c0, 0x00008000,
0x00000060, 0x00000000, 0x00000005, 0x0000a400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xa03fffef, 0x00000000, 0xfffffffe, 0xffffffff, 0x780fffff, 0xfffffffe, 0xffffffff, 0x787fffff,
0x00000000, 0x02060000, 0x00000000, 0x00000000, 0x00000000, 0x000001f0, 0x00000000, 0x00000000,
0x01102008, 0x084008cc, 0x00822600, 0x78000000, 0x7000c000, 0x00000002, 0x00002010, 0x00000000,
0x43f36f8b, 0x9b462542, 0xe3e0e82c, 0x400a0004, 0xdb365f65, 0x04497977, 0xe3f0ecd7, 0x18c5603a,
0x3403e60b, 0x37518000, 0x7eebe0c8, 0x98698200, 0x2d56ad48, 0x8060e803, 0xad93661c, 0xc568c03a,
0xc656aa60, 0x02403f7e, 0x146183cd, 0x21751020, 0x07122021, 0x40bc3000, 0x4562a624, 0x0a3060a8,
0x85740217, 0x9c840402, 0x14157ffb, 0x11e27f34, 0x22efb665, 0x60ff1f75, 0x38403a70, 0x676336c3,
0x20b24dd9, 0x0fc946b0, 0x4850bc98, 0xa03f8638, 0x98162388, 0x5232be49, 0xeba422ab, 0xc72c00dd,
0x26e1a1e7, 0x8f0a841b, 0x559e27eb, 0x89bfc241, 0x85480014, 0x084d6361, 0xaad07f0c, 0x05cfff3e,
0xa803ff1a, 0x7b407a41, 0x80024745, 0x38eb0500, 0x1005dc51, 0x710c9b34, 0x01000397, 0xa4046366,
0x005180d0, 0x430ac000, 0x30c89071, 0x58000008, 0xf7000ed9, 0x00415f80, 0x941000b0, 0x62800018,
0x09d00240, 0x01568200, 0x08015004, 0x05101d10, 0x001084c1, 0x10504025, 0x4d8a410f, 0xa60d4009,
0x914cab19, 0x098121c0, 0x0203c485, 0x80000672, 0x00080b04, 0x0009141d, 0x905c49c9, 0x16900009,
0x22200c65, 0x24338412, 0x47960c03, 0x42250a04, 0xd0880028, 0x4f0c4900, 0xd3aa14a2, 0x3e87d830,
0x1f618e04, 0x41867ea4, 0x2dbbc390, 0x211857ad, 0x2a48241e, 0x4e041138, 0x161b0a40, 0x88400d60,
0x9502020a, 0x10608221, 0x04000243, 0x80001444, 0x0c040000, 0x70000000, 0x00c11a06, 0x0c00024a,
0x00401a00, 0x40451404, 0xbdf30029, 0x052b0a78, 0xbfa0bba9, 0x8379407c, 0xe91d12fd, 0xc5695bf6,
0x444aeff6, 0xff022115, 0x402bed63, 0x0242d033, 0x00131000, 0x5dca1b42, 0x020000a0, 0x2c61a703,
0x8ff24880, 0x00000284, 0x100d5804, 0x0048b200, 0x20011894, 0x37805004, 0x684d3200, 0x68be49ea,
0x2e42184c, 0x21c9a820, 0x80b050b9, 0xff7c001e, 0x14e0849a, 0x01e028c1, 0xac49870e, 0xdddb130f,
0x89fbbe1a, 0x51b2a2e2, 0x32ca5522, 0x928b3ec6, 0x438f1dbf, 0x32986703, 0x73c03028, 0xa9230811,
0x3a65c000, 0x04028fe3, 0xa6252c4e, 0x00a1bf3d, 0x8cd43e3a, 0x317c06c9, 0xd52a00e0, 0x0edf018b,
0x8c22e34b, 0xf0911183, 0xa7287d94, 0x40fbc9ac, 0x07534484, 0x44445a90, 0x00013fc8, 0xf5d40048,
0xec5f7701, 0x891dc442, 0x49286b83, 0xd2424109, 0x59fe061d, 0x3a221840, 0x3b9fb7e4, 0xc0eaf003,
0x82021386, 0xe4008980, 0x10a1b200, 0x0cc44b80, 0x8944d309, 0x48341faf, 0x0c458259, 0x0470420a,
0x10c8a040, 0x44503140, 0x01004004, 0x05408281, 0x642c0108, 0x1a056a30, 0x051460a6, 0x645690cf,
0x31000021, 0xcbf09c18, 0x63e2e120, 0x01b5104c, 0x9a83538c, 0x3281b8b2, 0x0a84987a, 0x0c0233e7,
0xd038d6cd, 0x9872e1b1, 0xe2848a1e, 0x0459c3f4, 0x23c2439a, 0xd3144845, 0x36400292, 0xffbd0241,
0xe8f0eb09, 0xa5d27dc0, 0xd24bc242, 0xd0afa47f, 0x34a11aa0, 0x0bd88247, 0x651bc453, 0xc83ad294,
0x40c8001e, 0x33140e06, 0xb21f615f, 0xc0d00088, 0xa898a02a, 0x166ba1c5, 0x85b4af50, 0x0604c08b,
0x1e04f933, 0xa251056e, 0x76380400, 0x73b8ed07, 0x19324406, 0xc8164081, 0x63097c8a, 0xaa042984,
0xca9c1c24, 0x27614e0e, 0x830009d0, 0xc10c0846, 0x10816011, 0x0908540d, 0xcc0a000e, 0x0c000514,
0xa0440430, 0x6784008b, 0x8a195288, 0x8b18865e, 0x41602e59, 0x9cbe8c10, 0x895c6861, 0x00089800,
0x089a8100, 0xc1900018, 0xf4a14007, 0x640d8505, 0x0e4d314e, 0xff0a4806, 0x2ea81632, 0x000b852e,
0xca841810, 0x696c0e20, 0x16000032, 0x0390d658, 0x1a6851a0, 0x11249000, 0x432698e1, 0x1fae5d52,
0xae280fa0, 0x5700fafb, 0x99406408, 0xc044c880, 0xb1419005, 0xa4c48424, 0x603a1a34, 0xc1949000,
0x003a8246, 0xc106180d, 0x99100022, 0x1511e050, 0x00824157, 0x022a041a, 0x8930004f, 0x446ad813,
0xed228aa2, 0x400511c0, 0x01021000, 0x31018808, 0x02044620, 0x0f08f800, 0xa2008900, 0x22020000,
0x16108210, 0x10400042, 0x126052c0, 0x200052f4, 0x82308510, 0x42021100, 0x80b5430a, 0xda2070e1,
0x08012040, 0xfc653500, 0xab0419c1, 0x62140286, 0x00440087, 0x42469085, 0x0a85405c, 0x33803207,
0xb8c00400, 0xc0d0ce30, 0x0080c030, 0x0da50508, 0x00400a90, 0x280c0200, 0x40446705, 0x41226429,
0x000002e8, 0x847c4664, 0xde200002, 0x4049861d, 0xc0000a08, 0x20010084, 0x10108400, 0x01c742cd,
0xd52a703a, 0x1d8f9968, 0x3e12be50, 0x81d9aef5, 0x2412cec4, 0x732e0828, 0x4b3424ac, 0xd41d020c,
0x80002a02, 0x08110097, 0x114411c4, 0x7d451786, 0x5e4949dd, 0x87914040, 0xd8c4254c, 0x491444ba,
0xc8001b92, 0x15800271, 0x0c0000c1, 0xc200096a, 0x40024800, 0xba493021, 0x1c802080, 0x1008e2ac,
0x00341004, 0x841400e3, 0x20004020, 0x14149810, 0x04aa70c2, 0x54208688, 0x04130c62, 0x20109180,
0x02064082, 0x54011c40, 0xe4e90383, 0x84802125, 0x2810e433, 0xe60944c0, 0x81260a03, 0x080112da,
0x97906901, 0xf8864001, 0x0081e24d, 0xa6510a0e, 0x81ec011a, 0x8441c600, 0xb62eadb8, 0x8741acef,
0x4b028d54, 0x02681161, 0x2057bb60, 0x043350a0, 0xf7b4a8c0, 0x01122402, 0x20009ad3, 0x00c82271,
0x809e2081, 0xe1800c8a, 0x8151b009, 0x40281031, 0x89a52a0e, 0x620e69b6, 0xd1444425, 0x4d548085,
0x1fb12c75, 0x862dd807, 0x5841d97c, 0x226e414e, 0x9e088200, 0xedb7f80d, 0x75668c80, 0x08149313,
0xc8040e32, 0x6ea6484e, 0x66742c4a, 0xba0126c0, 0x185dd70c, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x05400000, 0x813370a0, 0x03a54f81, 0x641055ec, 0x2344c31a, 0x00341462, 0x1a090a43,
0x13a5187b, 0xa8480102, 0xc5440440, 0xe2dd8106, 0x2d481af0, 0x0416b626, 0x6e405058, 0x31128032,
0x0c0007e4, 0x420a8208, 0x803b4840, 0x87134860, 0x3428850d, 0xe5290319, 0x870a2345, 0x5c1825a9,
0xd9c577a6, 0x03e85e00, 0xa7000081, 0x41c6cd54, 0xa2042800, 0x2b0ab860, 0xda9e0020, 0x0e1a08ea,
0x11c0427e, 0x03768908, 0x01058621, 0x98a80004, 0xc44846a0, 0x20220d05, 0x914854a2, 0x28d78a01,
0x00087898, 0x31221605, 0x08804340, 0x06a2fa4e, 0x92110814, 0x9b142002, 0x16432e52, 0x90105000,
0x85ba0041, 0x20203042, 0x07a84f0b, 0x40802f08, 0x1a930591, 0x0601df50, 0x3021a202, 0x4e800630,
0x04c80cc4, 0x8001a004, 0xd4316000, 0x0a020880, 0x00281c00, 0x00418e18, 0xca106ad0, 0x4b00f210,
0x1506274d, 0x88900220, 0x82a85a00, 0x81504549, 0x80002004, 0x2c088804, 0x000508d1, 0x4ac48001,
0x0062e0a0, 0x0a42008e, 0x6a8c3055, 0xe0a5090e, 0x42c42906, 0x80b34814, 0xb330803e, 0x733c0102,
0x700d1494, 0x09400c20, 0xc040301a, 0xc094a451, 0x05c88dca, 0xa40c96c2, 0x34040001, 0x011000c8,
0xa9cd550d, 0x1cda2428, 0x48370142, 0x120f7a4d, 0x452a32b4, 0xd20531fb, 0xdc44b894, 0x45ca68d7,
0x2ed15097, 0x42081943, 0x9d48d202, 0xa0979840, 0x064d5409, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x84800000, 0x04215542, 0x17001c06, 0x61107624, 0xb9ddff87, 0x5c0a659f, 0x3c11245d,
0x005dadb0, 0x00000000, 0x00000000, 0x00db28d0, 0x02000422, 0x44080108, 0xac409804, 0x90288d0a,
0xe0018700, 0x00310400, 0x82211794, 0x10540019, 0x021a2cb2, 0x40039c02, 0x8804bd60, 0x7900080c,
0xba3c1628, 0xcb088640, 0x90807274, 0x0000001e, 0xd8000000, 0x9c87e188, 0x04124034, 0x2791ae64,
0xe6fbe86b, 0x5366408f, 0x537feea6, 0xb5e4e3ab, 0x0002869f, 0x01228548, 0x48004402, 0x20a02116,
0x02240004, 0x00052080, 0x01547e00, 0x01ac162c, 0x10852a84, 0x05308c14, 0xfdc3fbc3, 0x906060fa,
0x40336440, 0x96901200, 0x4e834b31, 0x418200d4, 0x1d6a0129, 0x02802080, 0x02ad8000, 0x9f0c2691,
0x67018044, 0x0c24d96f, 0x18d02910, 0x50215001, 0x04d01000, 0x02017090, 0x61c30148, 0x01000132,
0x07190088, 0x05620802, 0x4c0e0132, 0xf0a10405, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x035e8e8d, 0x5a0421bd, 0x11703488, 0x00000026,
0x10000000, 0x8804c502, 0xf801b815, 0x25ed147c, 0x3bb0ed60, 0x1bd78589, 0x1a627af3, 0x0ac50d0c,
0x524ae5d1, 0x6b0d0490, 0x5266a35c, 0x16122b57, 0x1101a872, 0x00182949, 0x10080948, 0x886c6000,
0x058f916e, 0x39903012, 0x49b0f840, 0x001b88a0, 0x00000000, 0x00428500, 0x98000058, 0x7014ea04,
0x611d1628, 0x60005193, 0x00a71a24, 0x00000000, 0x43c00000, 0x10187120, 0xa9270172, 0x89066004,
0x020cc022, 0x40810900, 0x8ca0602d, 0x00000e34, 0x00000000, 0x11012100, 0xd31a8011, 0x0892ec4c,
0x85000040, 0x1806c7ac, 0x0512e03e, 0x00348000, 0x80cec008, 0x0a126d01, 0x08568641, 0x0027011e,
0x083d3751, 0x4e05e032, 0x048401c0, 0x01400081, 0x00000000, 0x00000000, 0x00000000, 0x00591aa0,
0x882443c8, 0xc8001d48, 0x72030152, 0x04059813, 0x04008280, 0x0d148a10, 0x02088056, 0x2704a040,
0x4e000000, 0x00000000, 0x00000000, 0xa3200000, 0xa0ae1902, 0xdf002660, 0x7b17f010, 0x3ad08121,
0x00284180, 0x48001003, 0x8014cc00, 0x00c414cf, 0x30202000, 0x00000001, 0x00000000, 0x00000000,
0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000,
0xffffc000, 0x00003fff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xfffffffe, 0xffffffff, 0x7fffffff, 0xfffffffe, 0xffffffff, 0x00000000, 0x00000000, 0x0000003f,
]
UxCP932_SPARSE_HI_TABLE = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3393, 1919, 1903, 1887, 1871, 1855, 1839, 1823, 0, 0, 5914, 7723, 0, 3236, 0, 3206,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3377, 7195, 3362, 7185, 0, 0, 0,
3164, 1807, 1791, 1775, 1759, 3126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4907, 7720, 5394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2978, 2961, 2009, 0, 0, 0, 7175, 7165, 0, 7874, 0, 0, 0, 5323, 0, 0,
6434, 2384, 3348, 5334, 0, 2923, 6220, 0, 7794, 0, 2864, 2844, 0, 0, 0, 0,
+ 0, 2822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1743, 7870, 0, 0, 0, 0, 0, 0, 0, 0,
1051, 4898, 1727, 1714, 2721, 0, 0, 0, 0, 0, 5902, 4901, 7149, 0, 2790, 0,
5656, 0, 0, 0, 5159, 0, 5351, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1698, 1520, 0, 0, 3332, 1682, 1666, 1650, 1634, 3318, 3302, 1618, 1602, 1586, 1570, 3288,
+ 0, 0, 0, 6284, 0, 0, 0, 0, 0, 0, 7845, 0, 0, 0, 0, 0,
1374, 5109, 7151, 4780, 7835, 4671, 0, 7855, 5499, 7656, 2757, 0, 2703, 0, 0, 0,
3273, 3263, 5861, 3250, 4882, 6863, 2646, 792, 3236, 3220, 3206, 6857, 1554, 6418, 4878, 5854,
1538, 4053, 2607, 4865, 5844, 3191, 4509, 1531, 5833, 5827, 1515, 2437, 5813, 1499, 3175, 5804,
6843, 3160, 5793, 4406, 1489, 5781, 4110, 4855, 1527, 7142, 5288, 3347, 4843, 4833, 6389, 7596,
7140, 4827, 2648, 4815, 3146, 3825, 5766, 6409, 1475, 4807, 5755, 3131, 7126, 7286, 4793, 3116,
3104, 5416, 6793, 6398, 5741, 6763, 5732, 1463, 6632, 3094, 1447, 4783, 4776, 4760, 7592, 4749,
1436, 4740, 1425, 3082, 4729, 4714, 1288, 1416, 5138, 5724, 3073, 5642, 5712, 6384, 3057, 6837,
3042, 924, 3028, 7393, 3021, 155, 5041, 4701, 1400, 2015, 4688, 5704, 7120, 2596, 4675, 2273,
4317, 6502, 5206, 4665, 1393, 6829, 2496, 6589, 6376, 7576, 7569, 4266, 6290, 4786, 4654, 7561,
4237, 7558, 3940, 7555, 2691, 1188, 7386, 5222, 879, 2480, 2409, 6479, 2899, 4653, 561, 1381,
1367, 3841, 7547, 5581, 1257, 4917, 7109, 2436, 6267, 2419, 5701, 3981, 3011, 4647, 3882, 7379,
6367, 6724, 1318, 4642, 4889, 4631, 5397, 3001, 4968, 5513, 7503, 5688, 5904, 2990, 6351, 4618,
4606, 5677, 5662, 4230, 6345, 4599, 2980, 5338, 5655, 6820, 7104, 5641, 5176, 5637, 7708, 2823,
4988, 2815, 366, 6063, 6620, 2325, 6045, 2285, 0, 2662, 0, 7207, 5606, 5039, 7378, 3898,
7136, 2286, 2974, 2189, 4179, 1353, 7371, 6817, 1337, 6801, 5459, 1326, 5627, 1310, 4584, 1301,
2964, 3601, 4574, 2949, 1285, 2520, 1269, 7058, 2219, 7839, 6339, 4561, 4431, 2199, 1253, 4550,
5930, 2938, 6255, 0, 2318, 3237, 7697, 3227, 6753, 625, 1146, 7695, 7829, 2927, 4540, 4526,
6793, 5615, 6776, 4513, 2914, 5487, 7861, 4497, 2905, 7540, 4485, 7853, 2895, 1245, 5611, 1232,
2880, 1219, 2873, 4446, 4476, 5597, 5584, 1206, 5572, 2863, 2848, 6781, 6205, 7359, 3710, 1197,
3691, 4467, 1185, 2556, 5558, 820, 1169, 5863, 5545, 4455, 6773, 6331, 6918, 2832, 7356, 6321,
1153, 2821, 4558, 1137, 5531, 5521, 4441, 2814, 5197, 6762, 6747, 3010, 6737, 2186, 3181, 4427,
2799, 1132, 2541, 1116, 2789, 5735, 837, 2779, 6732, 4416, 6899, 5510, 4401, 4389, 943, 2772,
6308, 509, 7312, 7780, 7686, 4482, 7530, 7095, 1100, 4373, 5498, 5257, 1095, 4165, 3867, 7687,
5097, 7092, 5011, 6673, 607, 2100, 694, 5997, 3811, 5483, 6717, 5472, 4369, 7350, 1090, 4359,
3532, 7779, 4204, 6297, 6710, 4345, 6155, 7343, 5468, 1074, 2759, 3514, 2750, 7085, 4336, 1444,
1058, 5454, 1042, 2737, 2725, 4320, 4311, 6710, 4300, 5447, 2719, 4285, 6646, 7523, 3507, 1026,
1010, 6285, 7328, 2707, 2049, 1002, 994, 978, 7519, 4273, 967, 7322, 960, 2696, 4267, 2687,
7853, 5246, 6243, 6275, 2681, 950, 4847, 6267, 2234, 5436, 934, 5432, 6257, 4260, 913, 5277,
+918, 6697, 7080, 902, 2067, 6246, 890, 6234, 3074, 6224, 430, 2258, 4247, 2456, 5922, 3720,
6693, 4238, 4225, 4212, 7514, 4417, 5311, 3938, 1720, 1015, 2666, 6892, 5878, 2660, 7314, 3625,
3784, 2503, 7479, 5417, 4837, 884, 2650, 5407, 4200, 7070, 3442, 2635, 2621, 4190, 7822, 2003,
3852, 6690, 3560, 5975, 1432, 868, 496, 2615, 5401, 6213, 2165, 2599, 6202, 6679, 2591, 3664,
5059, 4176, 7562, 5387, 7831, 3568, 5373, 7777, 7065, 7057, 2732, 6141, 859, 4172, 4158, 6190,
7679, 5360, 843, 7671, 4539, 7046, 6661, 2994, 601, 704, 2079, 4148, 6669, 4143, 2451, 4128,
2381, 7826, 5356, 1371, 4810, 6164, 6101, 4141, 2583, 3756, 5888, 6124, 7672, 6179, 827, 4123,
2571, 2560, 7659, 907, 1690, 3623, 2492, 1505, 4071, 3111, 7811, 7304, 6084, 5116, 0, 2257,
3251, 6881, 2910, 3672, 7297, 7507, 5348, 1532, 3986, 4751, 3715, 1156, 4026, 819, 2204, 6655,
2881, 1048, 7770, 803, 5337, 4112, 6710, 5182, 7508, 3321, 792, 4104, 4620, 6171, 4099, 7651,
1509, 7038, 6155, 6148, 4705, 1486, 5442, 6140, 7496, 1455, 1296, 5476, 2550, 1115, 2535, 1997,
7648, 0, 5326, 4088, 1291, 6647, 787, 726, 2773, 3496, 2560, 531, 1534, 2109, 2530, 7294,
4083, 2514, 5318, 5308, 6126, 5294, 773, 761, 4068, 2292, 4883, 4059, 6121, 5288, 3276, 748,
2568, 1263, 7497, 2839, 4663, 3910, 6110, 2500, 2490, 2477, 1480, 734, 6100, 4044, 4038, 5280,
6089, 7806, 7037, 5721, 3026, 3130, 6643, 6020, 2150, 369, 3089, 724, 3417, 7765, 4023, 1554,
+865, 7121, 7489, 3424, 1322, 1252, 4968, 4768, 4010, 7029, 4952, 7019, 6632, 3534, 7278, 1151,
+577, 4635, 5541, 2138, 7019, 708, 3975, 5199, 692, 3789, 1709, 676, 4188, 1387, 6082, 1001,
2468, 6072, 153, 2460, 669, 2478, 6571, 655, 4740, 4000, 7635, 220, 5270, 2445, 647, 636,
3989, 3978, 5264, 7637, 6619, 3972, 6991, 5820, 7010, 3956, 1307, 3617, 628, 1216, 3745, 7812,
+310, 2099, 6612, 7274, 567, 618, 4251, 2778, 5254, 612, 3943, 3929, 2439, 3921, 294, 5240,
3915, 5229, 596, 590, 3899, 2333, 3892, 5222, 3200, 5207, 574, 558, 6331, 3878, 537, 3547,
6607, 1548, 3472, 3864, 5202, 5188, 7478, 542, 3849, 5177, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5237, 6406, 535, 2426, 7006, 5164, 5068, 2416, 6065, 6060, 4609, 6053, 5153,
5146, 5136, 2437, 5124, 2725, 3840, 672, 519, 7268, 6596, 2403, 7000, 6046, 7257, 662, 5120,
7252, 3053, 2709, 3035, 6869, 512, 5149, 499, 487, 6585, 6991, 478, 3832, 2392, 3823, 6034,
3808, 465, 7759, 7630, 2225, 7468, 3797, 3790, 4091, 1067, 6581, 5083, 1171, 2377, 6578, 6567,
3781, 6956, 4460, 7247, 459, 4290, 1161, 5111, 5962, 5105, 5947, 450, 3767, 4679, 447, 3760,
6029, 1137, 4107, 4283, 7236, 2520, 2362, 6980, 2675, 445, 292, 3744, 5096, 5089, 4019, 716,
3007, 2352, 2618, 1417, 2340, 7465, 6556, 2120, 5845, 5076, 6016, 520, 1174, 2855, 6309, 7455,
3161, 7453, 1030, 186, 3034, 438, 1730, 2594, 5698, 3645, 5064, 2804, 6549, 6004, 5997, 5945,
3734, 3768, 1398, 4590, 7753, 4529, 2328, 4489, 628, 1079, 1437, 935, 5993, 2952, 180, 5055,
6535, 7755, 5677, 2310, 3726, 5045, 6543, 426, 5042, 4923, 3885, 417, 2322, 5983, 745, 5028,
6531, 798, 5507, 6813, 4327, 1073, 410, 2539, 2307, 7447, 2297, 3689, 1062, 2631, 7240, 1335,
2287, 396, 6524, 5974, 5167, 2280, 2265, 5026, 5961, 3492, 3712, 341, 3696, 3171, 2250, 3687,
2241, 3676, 4356, 2792, 1202, 5010, 4218, 393, 2226, 6522, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3952, 3667, 1277, 5950, 7804, 4998, 5001, 377, 361, 2220, 3660, 3656, 2841,
5935, 7628, 0, 0, 0, 0, 6010, 7445, 3118, 1035, 1366, 491, 2024, 6973, 2204, 3637,
6420, 203, 1010, 7754, 6511, 244, 5769, 4721, 4991, 7208, 976, 233, 6499, 1336, 2045, 7613,
6968, 3642, 3133, 4979, 4972, 5525, 3294, 0, 0, 7796, 4006, 347, 2871, 1469, 3628, 3619,
+331, 315, 2199, 3608, 2183, 2169, 299, 3593, 288, 1005, 4960, 2615, 771, 2048, 4956, 4005,
+723, 2401, 2359, 2244, 7739, 7614, 6491, 7607, 5925, 2655, 2735, 7598, 272, 256, 3583, 1496,
6175, 1275, 1192, 5916, 2154, 2146, 4860, 1070, 7233, 5907, 2339, 2142, 666, 6967, 3572, 3559,
+600, 2131, 240, 6955, 6948, 7228, 401, 470, 644, 5595, 6485, 547, 3931, 2129, 7436, 623,
+829, 6478, 249, 6845, 7434, 2921, 4047, 224, 603, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 541, 212, 7222, 3552, 4942, 6467, 7210, 3252, 0,
+ 0, 473, 2118, 755, 198, 193, 6463, 3540, 6449, 6942, 184, 4934, 2111, 5895, 6934, 5888,
+175, 3527, 3070, 2096, 3516, 3503, 3490, 4513, 2082, 1728, 3476, 1983, 7202, 424, 958, 3466,
2070, 5782, 2357, 6927, 6915, 6442, 4865, 7802, 0, 0, 2172, 983, 1246, 3088, 3452, 2755,
6910, 2066, 2053, 883, 6359, 7429, 0, 0, 0, 5686, 6904, 348, 7420, 163, 1109, 861,
+260, 1353, 763, 405, 1469, 6433, 6897, 0, 0, 0, 453, 1401, 162, 2037, 3445, 5659,
+423, 1975, 3435, 4393, 2029, 4130, 318, 2932, 685, 2022, 2008, 4376, 145, 4817, 7415, 7742,
3423, 5882, 1999, 745, 2084, 3478, 225, 904, 0, 0, 0, 0, 0, 0, 4572, 3322,
5869, 1226, 6886, 158, 6858, 326, 146, 2588, 3455, 301, 3184, 5370, 1124, 273, 3560, 2419,
+ 0, 4938, 0, 0, 0, 0, 0, 4297, 3215, 1994, 5557, 7400, 3579, 1980, 144, 6875,
1099, 377, 434, 684, 7726, 579, 4921, 2949, 264, 848, 258, 0, 0, 0, 0, 0,
+ 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0,
+182, 128, 3409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1964, 112, 96, 80, 64, 1950, 1934, 48, 32, 16, 0, 0, 0, 0, 7730, 0,
]
UxCP932_SPARSE_LO_TABLE = [
+ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
33101, 33409, 33410, 33411, 33412, 33413, 33414, 33415, 33416, 33417, 33418, 33419, 33420, 33421, 33422, 33423,
33391, 33392, 33393, 33394, 33395, 33396, 33397, 33398, 33399, 33400, 33401, 33133, 33119, 33134, 33103, 33105,
33175, 33376, 33377, 33378, 33379, 33380, 33381, 33382, 33383, 33384, 33385, 33386, 33387, 33388, 33389, 33390,
33359, 33360, 33361, 33362, 33363, 33364, 33365, 33366, 33367, 33368, 33094, 33095, 33155, 33153, 33156, 33096,
64156, 64177, 64216, 64232, 64234, 64344, 64350, 64373, 64381, 64382, 64384, 64386, 64390, 64393, 64402, 64413,
60027, 59839, 36244, 38583, 64489, 60028, 59970, 59842, 60029, 57958, 36079, 59840, 37851, 64584, 38481, 60030,
59843, 59978, 59791, 37523, 59757, 35822, 37009, 36589, 35309, 36227, 39402, 59756, 59898, 59897, 59754, 36601,
59755, 59792, 59753, 59578, 58804, 59579, 36971, 59580, 35138, 38892, 58725, 38871, 59575, 59582, 59584, 59561,
59308, 36032, 59560, 58802, 64144, 64155, 37321, 64492, 59544, 58726, 38285, 59126, 38339, 59549, 59551, 59550,
59552, 59547, 59545, 36222, 38629, 59546, 59512, 37197, 59124, 59125, 59127, 59513, 57982, 38338, 59514, 35402,
59503, 59876, 57984, 35163, 64224, 59504, 35149, 59505, 59877, 59227, 59229, 57987, 59508, 59506, 59509, 59511,
36857, 64472, 59457, 59459, 59203, 64471, 35793, 59230, 38244, 59210, 59492, 36576, 38978, 59205, 59388, 36342,
59352, 35808, 60062, 37078, 59490, 59764, 59353, 64443, 37698, 59766, 64442, 59356, 35480, 36970, 64444, 59354,
59348, 59349, 35666, 59765, 59993, 38836, 38094, 36305, 36575, 59350, 59992, 59351, 38818, 36708, 38636, 38858,
59313, 59312, 59310, 57988, 35538, 58606, 36198, 59278, 58101, 59315, 59314, 35219, 37227, 38854, 36013, 59316,
38777, 58584, 64437, 59305, 37707, 58103, 58053, 59980, 37272, 36565, 59306, 37504, 59283, 58054, 37628, 37746,
59284, 59288, 36992, 58059, 38023, 37578, 59972, 59971, 37056, 59287, 37292, 37342, 37271, 38980, 37798, 59973,
59280, 35700, 35148, 59968, 59969, 37454, 59289, 35291, 59286, 59299, 37799, 37443, 36938, 37983, 38126, 37497,
37865, 35682, 59272, 64423, 37554, 38355, 37586, 36254, 59752, 38625, 37448, 59077, 59078, 35661, 36944, 59080,
38019, 37341, 57810, 39757, 38127, 37724, 59076, 38360, 38502, 38281, 36320, 36214, 36059, 36066, 60042, 57812,
38254, 35293, 38092, 59075, 35537, 37075, 59074, 59079, 37529, 35683, 58303, 36855, 58975, 59042, 64419, 35920,
36076, 59464, 58974, 37365, 35660, 37803, 59043, 58977, 64428, 58978, 58875, 36823, 59770, 35916, 58945, 59466,
58944, 58844, 58846, 59776, 58947, 36049, 58834, 58946, 35007, 58948, 37002, 35544, 58835, 59808, 40659, 58832,
58845, 37519, 37228, 60043, 59625, 40656, 35699, 58833, 58830, 35804, 58729, 39292, 40644, 36686, 60044, 58568,
35733, 36522, 38840, 38793, 35825, 58730, 38614, 58551, 38380, 38246, 58559, 58532, 58597, 36252, 35288, 58573,
58535, 58482, 59788, 39086, 37264, 35956, 64479, 58483, 38364, 35546, 35168, 36014, 37187, 36727, 58455, 38289,
36685, 37206, 59465, 58456, 36831, 38284, 58458, 58446, 58462, 58447, 58443, 58459, 58457, 37982, 37291, 58444,
37490, 58445, 40841, 36248, 58438, 59109, 36208, 58442, 40849, 59108, 40842, 37552, 38304, 37186, 37543, 64248,
38277, 58436, 37338, 58435, 36207, 39026, 35731, 58336, 64414, 58335, 58334, 37550, 35762, 58337, 36933, 58452,
58338, 58710, 58708, 35522, 58339, 38999, 58340, 58275, 58276, 37623, 58221, 58278, 58277, 58217, 35914, 58279,
36515, 38354, 35529, 59468, 37559, 38601, 58280, 58248, 35036, 58252, 58251, 58255, 59472, 58257, 58214, 36202,
38612, 35062, 37588, 58204, 37475, 64396, 58212, 58072, 58201, 37469, 58069, 58206, 35003, 38600, 64397, 39577,
58209, 58203, 36810, 58068, 37072, 60047, 58071, 60048, 57924, 58207, 36600, 35035, 58202, 58210, 36311, 37218,
58183, 36961, 60050, 58185, 37222, 38497, 36341, 36816, 36270, 38558, 64478, 40929, 59510, 58184, 36427, 36487,
37595, 37083, 58182, 38877, 58082, 38060, 38833, 59385, 40941, 38036, 58073, 37221, 37971, 40343, 58070, 36716,
58077, 39893, 58074, 35006, 37087, 58041, 58789, 64484, 38093, 58075, 58045, 38353, 58002, 37498, 39889, 58040,
58042, 38746, 35747, 58043, 39262, 37500, 36529, 36813, 57998, 57999, 36726, 35526, 37814, 58000, 64389, 57972,
35481, 37447, 64391, 35978, 58001, 35718, 37467, 36051, 57973, 35827, 35067, 58351, 57974, 36242, 37114, 38372,
57965, 37263, 58332, 38515, 37960, 58358, 57967, 57945, 58333, 59381, 37071, 35182, 35256, 57946, 57947, 38908,
59831, 35799, 35281, 37827, 57960, 35798, 64202, 38208, 39004, 37204, 60045, 35004, 64579, 40340, 57939, 38528,
36025, 35280, 37621, 38303, 38739, 40341, 36736, 57936, 40931, 57935, 37219, 57932, 38829, 36193, 57934, 40944,
58609, 36714, 36959, 57933, 57813, 59325, 57585, 37813, 58616, 36282, 57814, 58608, 57588, 57815, 57772, 57819,
57817, 57818, 57773, 57816, 57589, 60041, 57774, 57775, 57776, 59870, 38817, 59872, 57730, 36429, 57732, 57733,
37491, 58857, 35471, 59851, 35158, 38504, 57731, 59874, 57728, 35033, 57725, 57726, 36852, 57702, 37226, 57699,
37867, 57698, 34978, 37323, 35048, 38057, 59769, 38220, 35653, 57694, 38826, 35948, 57695, 36216, 57693, 38100,
57696, 39001, 57697, 38874, 64367, 64363, 57586, 60066, 35677, 38800, 57527, 37883, 57584, 57587, 35468, 57528,
38474, 58862, 57573, 57511, 36002, 57512, 35491, 38086, 36573, 38275, 64093, 58874, 58864, 38634, 57513, 57514,
37237, 36514, 57515, 38867, 35760, 57494, 36176, 57496, 35213, 36762, 57491, 36234, 37959, 40089, 40075, 40887,
59486, 64188, 39546, 40079, 59487, 40268, 38804, 57436, 40266, 57440, 37363, 35732, 37742, 40269, 40916, 40925,
34989, 35153, 64328, 38319, 35255, 60060, 40918, 37290, 40909, 40911, 36192, 38788, 60061, 57971, 59760, 59761,
40902, 40896, 40893, 36283, 36524, 59763, 38866, 40899, 59762, 40840, 64322, 35518, 36728, 57828, 35224, 39558,
64246, 37872, 40839, 36189, 40798, 39557, 35428, 35517, 40800, 39559, 37869, 40638, 37864, 40799, 39562, 40801,
59736, 59737, 64233, 40802, 40642, 40629, 40637, 35782, 40632, 36732, 37836, 57455, 40610, 57457, 59878, 40633,
59879, 40617, 40604, 40635, 40614, 37590, 39023, 40598, 40608, 57456, 40612, 35030, 37734, 36092, 40600, 36952,
40618, 38584, 40605, 36929, 37573, 40595, 40593, 35918, 36797, 39397, 58798, 35809, 39659, 36070, 38812, 35730,
35431, 38790, 58801, 40584, 58792, 37618, 35787, 35915, 64227, 35514, 35690, 35463, 36928, 40296, 40301, 40578,
64228, 37318, 36343, 38545, 38335, 36438, 40565, 39015, 40549, 37013, 38209, 59626, 37954, 40548, 40564, 38032,
40543, 59225, 40542, 37772, 40412, 40416, 36045, 35694, 59717, 37990, 59224, 36967, 59226, 59718, 40544, 35819,
36796, 38082, 40537, 36848, 38619, 40539, 40540, 38792, 64225, 36812, 36318, 37306, 40545, 36571, 38743, 36185,
36849, 38004, 36293, 40538, 35034, 39152, 37741, 40695, 40536, 37289, 35982, 38732, 59208, 38396, 40768, 38302,
64223, 40523, 40520, 40567, 35784, 35175, 36184, 40521, 58723, 40522, 36753, 37250, 64222, 64102, 39382, 37213,
37212, 37334, 35174, 38806, 59106, 57786, 64212, 36724, 57506, 38534, 36336, 33951, 33962, 33952, 33963, 36794,
64210, 37029, 64206, 57507, 36182, 40414, 58966, 33953, 36265, 36792, 33964, 64209, 40413, 58506, 36793, 36218,
38590, 36264, 38115, 38081, 38279, 64461, 64462, 35238, 36549, 37740, 58508, 38847, 38503, 40397, 36558, 58876,
35805, 40398, 40361, 40362, 37702, 40364, 58788, 40323, 36419, 40359, 37301, 40329, 40310, 40324, 35675, 37244,
40326, 40365, 60039, 60040, 36598, 40315, 38240, 59767, 36790, 37699, 40309, 40314, 40260, 64356, 40261, 40262,
37333, 64354, 59758, 59759, 36043, 59985, 59991, 38623, 59984, 57570, 59989, 38491, 37036, 35300, 35322, 64199,
40187, 64197, 35005, 59990, 58558, 40134, 37066, 40188, 64196, 59073, 40256, 35969, 39888, 40132, 40135, 40127,
40131, 40117, 36676, 57923, 40120, 37965, 39890, 40114, 39891, 38650, 38649, 64404, 57922, 57492, 40124, 40125,
35027, 40062, 57493, 35320, 40083, 40085, 37488, 39021, 35489, 36262, 35254, 40077, 40088, 40087, 35761, 58707,
37287, 37331, 40061, 38805, 39545, 58709, 35709, 40072, 37035, 35205, 40066, 35318, 40071, 40107, 40057, 35482,
35759, 59502, 37967, 59030, 59363, 40056, 36786, 35173, 40054, 40037, 36250, 59034, 40060, 40038, 59031, 38640,
59033, 59032, 38110, 37875, 40021, 40041, 35708, 37538, 35064, 40022, 38308, 36175, 59895, 58046, 37487, 59894,
40012, 40010, 37613, 40011, 40013, 35221, 35204, 37612, 40014, 59892, 35994, 35316, 37973, 39931, 40015, 37881,
35430, 59720, 59719, 40000, 59721, 37819, 35756, 40003, 40004, 39596, 40002, 36322, 38239, 35299, 39860, 39865,
35791, 36809, 39863, 38486, 38389, 37738, 36550, 39594, 39597, 37239, 38810, 64450, 59365, 59058, 57737, 59362,
59364, 39842, 59059, 39843, 37844, 35783, 39835, 37848, 37096, 59360, 35727, 39836, 57582, 35836, 35924, 37837,
35246, 39365, 36466, 39837, 39840, 39822, 39366, 35147, 39824, 35551, 37534, 39823, 35527, 37025, 39815, 36507,
35494, 35829, 39814, 37326, 36597, 37468, 64169, 39622, 37115, 35504, 37607, 36945, 39819, 36416, 36297, 57833,
35500, 35409, 35203, 36778, 35270, 60063, 39810, 38757, 64377, 39806, 36012, 58971, 39808, 36712, 37358, 58972,
35142, 36583, 35008, 59234, 37238, 35502, 36531, 37870, 36167, 36465, 39794, 37275, 36017, 36165, 39795, 64166,
36506, 37302, 59768, 39796, 39797, 36473, 36166, 39579, 38608, 36591, 38366, 39581, 40953, 40955, 37014, 39583,
39582, 34661, 39584, 37201, 39585, 36258, 35991, 35021, 36989, 57408, 40951, 34665, 35272, 38242, 39578, 36037,
57949, 39504, 36241, 38121, 39580, 37357, 39509, 36772, 39408, 59789, 37220, 58770, 39410, 39506, 39412, 58771,
38626, 35419, 64146, 36334, 39009, 59790, 39401, 39399, 35059, 35563, 64140, 37286, 35696, 38801, 37280, 39369,
35253, 36768, 35751, 39368, 39352, 64139, 38337, 35752, 37619, 36704, 35713, 38105, 64137, 38630, 37877, 58787,
39353, 38383, 39344, 64138, 39345, 40411, 38084, 35265, 58796, 39347, 38898, 39349, 58790, 64134, 35232, 40415,
36757, 37751, 36229, 39328, 39329, 35816, 64375, 36840, 39323, 35460, 39317, 39315, 37230, 59773, 35807, 59772,
59774, 38356, 59771, 39266, 39319, 39267, 39318, 59273, 37856, 35198, 59778, 64507, 39270, 36347, 64372, 39269,
36292, 64116, 39271, 64122, 39150, 57555, 38119, 64120, 39151, 39155, 35020, 39132, 39130, 59358, 59359, 39125,
38350, 35396, 37293, 39128, 59357, 39131, 39129, 59361, 38363, 35716, 39126, 35744, 35263, 36572, 36304, 57543,
33145, 33146, 33191, 33196, 33131, 33132, 39748, 39160, 38553, 38286, 36082, 39119, 39162, 34688, 35264, 34689,
38329, 39113, 64107, 35561, 38484, 64108, 39117, 36081, 57593, 37112, 36455, 39106, 35017, 57594, 58226, 36062,
35562, 38298, 36697, 36973, 39100, 37070, 39098, 38043, 39099, 35703, 36552, 58228, 36257, 35310, 57827, 39097,
39096, 38311, 33664, 33665, 33666, 33667, 33668, 33669, 33670, 33671, 33672, 33673, 33674, 33675, 33676, 33677,
33678, 33679, 33647, 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33655, 33656, 33657, 33658, 33659, 33660,
33661, 33662, 33631, 33632, 33633, 33634, 33635, 33636, 33637, 33638, 33639, 33640, 33641, 33642, 33643, 33644,
33645, 33646, 33615, 33616, 33617, 33618, 33619, 33620, 33621, 33622, 33623, 33624, 33625, 33626, 33627, 33628,
33629, 33630, 33502, 33503, 33504, 33505, 33506, 33507, 33508, 33509, 33510, 33511, 33512, 33513, 33514, 33515,
33516, 33517, 33486, 33487, 33488, 33489, 33490, 33491, 33492, 33493, 33494, 33495, 33496, 33497, 33498, 33499,
33500, 33501, 33470, 33471, 33472, 33473, 33474, 33475, 33476, 33477, 33478, 33479, 33480, 33481, 33482, 33483,
33484, 33485, 33454, 33455, 33456, 33457, 33458, 33459, 33460, 33461, 33462, 33463, 33464, 33465, 33466, 33467,
33468, 33469, 33088, 33089, 33090, 33110, 40947, 33112, 33113, 33114, 33137, 33138, 33139, 33140, 33141, 33142,
33143, 33144, 33979, 35738, 57941, 33969, 33960, 57943, 37480, 33976, 33981, 57944, 40698, 33971, 33961, 33973,
59614, 33977, 33968, 33959, 33980, 40696, 36071, 33975, 36834, 58731, 33970, 33958, 59615, 37518, 33974, 34624,
34625, 34626, 34627, 34628, 34629, 34630, 34631, 34632, 34633, 34634, 34635, 34636, 34637, 34638, 34639, 33922,
33923, 33924, 33925, 33926, 33927, 33928, 33929, 33930, 33931, 33932, 33933, 33934, 33935, 33936, 33937, 33904,
33905, 33906, 33907, 33908, 33909, 33911, 33912, 33913, 33914, 33915, 33916, 33917, 33918, 33920, 33921, 33873,
33874, 33875, 33876, 33877, 33878, 33879, 33880, 33881, 33882, 33883, 33884, 33885, 33886, 33887, 33888, 33856,
33857, 33858, 33859, 33860, 33861, 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, 112,
+ 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 161,
+ 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 33424, 33425,
33426, 33427, 33428, 33429, 33430, 33431, 33432, 33433, 33434, 33135, 33122, 33136, 33120, 33097, 64087, 33172,
33168, 33171, 33173, 64086, 33129, 33130, 33174, 33147, 33091, 33148, 33092, 33118, 60022, 64587, 36245, 59809,
60023, 59810, 59619, 59620, 57554, 38617, 59811, 37345, 60024, 60026, 60025, 60011, 60009, 39003, 57596, 60010,
59869, 38893, 64358, 59868, 59867, 57575, 40829, 60012, 59836, 38873, 64090, 36027, 38248, 59865, 35057, 39411,
59837, 39406, 38542, 36428, 33264, 36344, 37198, 59832, 38313, 59830, 59107, 64145, 59833, 59834, 35392, 36272,
59823, 59822, 38563, 59115, 59113, 59835, 59793, 59110, 59794, 59795, 59825, 59826, 59824, 36226, 64508, 37725,
59235, 64576, 40532, 59796, 59797, 59733, 59729, 40535, 59238, 59732, 37017, 59324, 64504, 35545, 64438, 38811,
35015, 59734, 36448, 59735, 59726, 35308, 59727, 38341, 37560, 36256, 59728, 36224, 36743, 38763, 36987, 59730,
59731, 35052, 59633, 59609, 40942, 59632, 35475, 59607, 59611, 40930, 59873, 59871, 37452, 59612, 40936, 35014,
59589, 59613, 38985, 64493, 58048, 39379, 58055, 58049, 40528, 59590, 58058, 64494, 37701, 59591, 59592, 37021,
35557, 57595, 58064, 38745, 35307, 36695, 36057, 59540, 59571, 35162, 59570, 36499, 59572, 59569, 59541, 58704,
36323, 59480, 37708, 37005, 59542, 59543, 58705, 59473, 59474, 59477, 64380, 37006, 59456, 59458, 59479, 64483,
64477, 64475, 59375, 64457, 36518, 59383, 38887, 59382, 36560, 59367, 64453, 64456, 59380, 35220, 37715, 59368,
59366, 57809, 59371, 59369, 57808, 59374, 38518, 37362, 64455, 59296, 59297, 59298, 37817, 37442, 35041, 59302,
38551, 59303, 60065, 40860, 38295, 37307, 59715, 59304, 37849, 37003, 35321, 59716, 37496, 35172, 35830, 39786,
59300, 38742, 35166, 39789, 38357, 35295, 59295, 37282, 59285, 34983, 38977, 39790, 57498, 37077, 59290, 59119,
39859, 37255, 36439, 57500, 36055, 37343, 59116, 59117, 57499, 36931, 39383, 38984, 35306, 59082, 38983, 37568,
39012, 58488, 59044, 36497, 59081, 36445, 37295, 39847, 37624, 59098, 37191, 38848, 40396, 40588, 59045, 38014,
59046, 38500, 35193, 35040, 59329, 37795, 59328, 40596, 59017, 40583, 59011, 59019, 59012, 59016, 59008, 37860,
37626, 59006, 57463, 40673, 40643, 59004, 40662, 38720, 36496, 35186, 38466, 58989, 35959, 40654, 57474, 36494,
40649, 40646, 36493, 37710, 39020, 58988, 58987, 37190, 36284, 37312, 58983, 39501, 36825, 38237, 39498, 36030,
64148, 37625, 58973, 58982, 39785, 35678, 36492, 35958, 57706, 36981, 58957, 58976, 38585, 37794, 57707, 58959,
38807, 57708, 58958, 36965, 38774, 58960, 58952, 58817, 58961, 38306, 37989, 58953, 58818, 58954, 36009, 58819,
64178, 58821, 35659, 36313, 38900, 58847, 58848, 37269, 58773, 39881, 39878, 58784, 39880, 35979, 35290, 36261,
58780, 38816, 58785, 58188, 58617, 58688, 58781, 38103, 58197, 64395, 64460, 36201, 58620, 36820, 36551, 58690,
37195, 38348, 35772, 38560, 58615, 58614, 59636, 58610, 58611, 59635, 35157, 38290, 58594, 37791, 64441, 58613,
34991, 38506, 37802, 58587, 37697, 58583, 37266, 58577, 58585, 58590, 35217, 58514, 38888, 37339, 35737, 38233,
38243, 34708, 58526, 36541, 35285, 58524, 36247, 58522, 58513, 58465, 34709, 37279, 38994, 33253, 33159, 34712,
58467, 58466, 58469, 59326, 36050, 36488, 64440, 58470, 38124, 39560, 59327, 37976, 36008, 38498, 39563, 58349,
58347, 64401, 36205, 58296, 35921, 39016, 39604, 39564, 37185, 35680, 58281, 59994, 37353, 36331, 58300, 58297,
59998, 58284, 58282, 58283, 36319, 35954, 58322, 58095, 37493, 58097, 36942, 38837, 58096, 58323, 64388, 39666,
57994, 36048, 57993, 39602, 38358, 37207, 57995, 57996, 40645, 38835, 57997, 40648, 59629, 57961, 35054, 40948,
38764, 38538, 40954, 57964, 35656, 40653, 40663, 57962, 35282, 35949, 57963, 36197, 57954, 36424, 34986, 37622,
57769, 57955, 37061, 57768, 39561, 57966, 57770, 57771, 64371, 64369, 57763, 64370, 64368, 57764, 37705, 57459,
35398, 36195, 57765, 39505, 57758, 57766, 57759, 35278, 57767, 40786, 57760, 37780, 57761, 40787, 38061, 37743,
57762, 38034, 38227, 36249, 35156, 57681, 40789, 57680, 39839, 35835, 35523, 39838, 36978, 37719, 37723, 37528,
57682, 37046, 57664, 35467, 38234, 57665, 37294, 36588, 35490, 57666, 64355, 57667, 57568, 36688, 40257, 58949,
57668, 35933, 58950, 37101, 38087, 57569, 57567, 40258, 35279, 58951, 37052, 40259, 35673, 40068, 57563, 64353,
36440, 57445, 57571, 37567, 57565, 38253, 40074, 57592, 57453, 57729, 57450, 57449, 57446, 57452, 37842, 57454,
64334, 57736, 64335, 57734, 57442, 57735, 57443, 57415, 57414, 57420, 57447, 37023, 64583, 57411, 59974, 64331,
38465, 37991, 35715, 58732, 37700, 57423, 59979, 37517, 40861, 40867, 35277, 37880, 39493, 35000, 40865, 38310,
38651, 40863, 36513, 36800, 40856, 40862, 35208, 37311, 59319, 35714, 40850, 58607, 59320, 39626, 38028, 37696,
37587, 35976, 35650, 40823, 35652, 40848, 58612, 35068, 40824, 35440, 38378, 38536, 40819, 40818, 40820, 35235,
37481, 58967, 40821, 58968, 58969, 36421, 35435, 40822, 39844, 39251, 37729, 40803, 36478, 37043, 36255, 36077,
38288, 37057, 38724, 38368, 39011, 40777, 38062, 38981, 38013, 36501, 40697, 36696, 40699, 40700, 40780, 35833,
39770, 38225, 40776, 40778, 40779, 58586, 40775, 58581, 40589, 40571, 35973, 35946, 37773, 64230, 36819, 40569,
37516, 35012, 38646, 36548, 36338, 35164, 40572, 40574, 38494, 35513, 36280, 37109, 36703, 38543, 35424, 37208,
37585, 39544, 38733, 34676, 36585, 40560, 40559, 38512, 58362, 40531, 40534, 40533, 34691, 35575, 58361, 64219,
35712, 37544, 40530, 33982, 58363, 38895, 40424, 36510, 36183, 40422, 36450, 58327, 33972, 38377, 40423, 58326,
36951, 59341, 64099, 36829, 40421, 40419, 40417, 40418, 64321, 59344, 59342, 35413, 64208, 37515, 59343, 40403,
40517, 40401, 40404, 38839, 40402, 35065, 34677, 35001, 34996, 37113, 40405, 35794, 37067, 37296, 38272, 36500,
38479, 36860, 40399, 36449, 37478, 40297, 36474, 35997, 38814, 40302, 36417, 36233, 34997, 38340, 64364, 58080,
57590, 38269, 36677, 40284, 38113, 36746, 40263, 40270, 38624, 40273, 36787, 59024, 37102, 59323, 38112, 40182,
36584, 35806, 36299, 40264, 58743, 33276, 59028, 40183, 40184, 38376, 58739, 40186, 40185, 36702, 35028, 40147,
39759, 40138, 40144, 40151, 35939, 40139, 64195, 38586, 33244, 39762, 40113, 39760, 38780, 34982, 39758, 35824,
34980, 39014, 35063, 40105, 35508, 64192, 36464, 57744, 40111, 64429, 36251, 57743, 37065, 64430, 64191, 35026,
40049, 36068, 57745, 59087, 59088, 36215, 59086, 58711, 40050, 38300, 36730, 34713, 58712, 40051, 38135, 36761,
40044, 37739, 36701, 58715, 58713, 34710, 37822, 40048, 40047, 35145, 64183, 38552, 36982, 40046, 38637, 36023,
36042, 38361, 40023, 40016, 38989, 35965, 40024, 38042, 40030, 40017, 38334, 40020, 39071, 39087, 57505, 36526,
39928, 39929, 38000, 39571, 39569, 39567, 39570, 39930, 38901, 38988, 37537, 39572, 36172, 36783, 39932, 38579,
38109, 39573, 39914, 36784, 36805, 39913, 39912, 38301, 36760, 39921, 35539, 59495, 38648, 34704, 38521, 64182,
39915, 39899, 39898, 59507, 59497, 39900, 64578, 59500, 59829, 64577, 39901, 39872, 37100, 36674, 39873, 39867,
35410, 39868, 39877, 39876, 39875, 39871, 36673, 60058, 58794, 39870, 58811, 60059, 60057, 39833, 39834, 36570,
36939, 37874, 36979, 38134, 37953, 38293, 37098, 64089, 36555, 39825, 36779, 39826, 39827, 35025, 37304, 36977,
36844, 39828, 37809, 36780, 39673, 33166, 39672, 64163, 39788, 35228, 37594, 39674, 36775, 39676, 37444, 39641,
39675, 39640, 38321, 36232, 40913, 39642, 39644, 39643, 40919, 39625, 39646, 39621, 39635, 39648, 36975, 36545,
39024, 36540, 39629, 39599, 35995, 58575, 39610, 36717, 35247, 39611, 64154, 64153, 40169, 39390, 38532, 38979,
35510, 36841, 37509, 38384, 38505, 37606, 36064, 36240, 64374, 57799, 38107, 39398, 37445, 39396, 37981, 35548,
39391, 39392, 39394, 39388, 37551, 35688, 35429, 58727, 36053, 58434, 36231, 35687, 37597, 35140, 37807, 38588,
36160, 38809, 35170, 37232, 36091, 36035, 35813, 35698, 58360, 39385, 37440, 37372, 35753, 36770, 39386, 39384,
35266, 39372, 59587, 40641, 35412, 38582, 39374, 39373, 59588, 36990, 35160, 39354, 36325, 39355, 35197, 39375,
35196, 57811, 39356, 38211, 35814, 35043, 38347, 39325, 39322, 37821, 39321, 38130, 58314, 36725, 38852, 36936,
37761, 38861, 64133, 36974, 39299, 36087, 38314, 37080, 35488, 57461, 35495, 39300, 39296, 35405, 39302, 59105,
57460, 39297, 35749, 37556, 37834, 35226, 36719, 33910, 35194, 38047, 39298, 39285, 39283, 39284, 39282, 36321,
39286, 38632, 38882, 59250, 57800, 57803, 38009, 38870, 39287, 64130, 39257, 35058, 36691, 36019, 35930, 36699,
37531, 35746, 37094, 36085, 64126, 36238, 39259, 38598, 37733, 39148, 37756, 58689, 39137, 33862, 36084, 58722,
37224, 36083, 39135, 58717, 58719, 38856, 64119, 36568, 36941, 39007, 38547, 39133, 39134, 59003, 59015, 37555,
40174, 59014, 64424, 40173, 59981, 36675, 39147, 36274, 38723, 59982, 37324, 59977, 35261, 64110, 39111, 59890,
38749, 39107, 39109, 36332, 39110, 39747, 39091, 38483, 39092, 58196, 36080, 35045, 38546, 33152, 35740, 58198,
60005, 35741, 35742, 37600, 38842, 35165, 36061, 60006, 36060, 35044, 60007, 60008, 39018, 39017, 39883, 36273,
34975, 39884, 39089, 39090, 35668, 38802, 39082, 39879, 64176, 39083, 38841, 33150, 38748, 37256, 39085, 36502,
37873, 39869, 39088, 39075, 35832, 59537, 59539, 64340, 39076, 59538, 35547, 37455, 57473, 36581, 39077, 39072,
35150, 39078, 64339, 35470, 39073, 37026, 39360, 35701, 38328, 35050, 37530, 0, 36533, 36837, 38815, 57723,
38556, 36836, 36431, 36835, 35258, 37257, 38259, 38750, 33680, 33681, 33682, 33683, 33684, 33685, 33686, 35908,
59264, 59265, 59266, 33093, 33115, 33106, 33107, 33600, 33601, 33602, 33603, 33604, 33605, 33606, 33607, 33608,
33609, 33610, 33611, 33612, 33613, 33614, 33518, 33519, 33520, 33521, 59882, 57525, 0, 38480, 38594, 57526,
37838, 33098, 33099, 33108, 33109, 33439, 33440, 33441, 33442, 33443, 33444, 33445, 33446, 33447, 33448, 33449,
33450, 33451, 33452, 33453, 34711, 39164, 39234, 39163, 36290, 33121, 36765, 33224, 33225, 34715, 34716, 34706,
33256, 35928, 34707, 33727, 33728, 33729, 33730, 33731, 33732, 33733, 33734, 33735, 33736, 33737, 33738, 33739,
33740, 33741, 33695, 33696, 33697, 33698, 33699, 33700, 33701, 33702, 33703, 33704, 33705, 33706, 33707, 33708,
33709, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 64415, 64416, 64425, 64433, 64435, 64436, 64439, 64467, 64474, 64490, 64502, 64503, 64505, 64585, 64582,
57820, 0, 38467, 59864, 37994, 59860, 57821, 59861, 59857, 59863, 37750, 59859, 35458, 59812, 59813, 36219,
59814, 0, 59815, 59816, 59817, 59818, 40814, 59798, 59799, 59819, 59820, 59800, 40815, 40816, 35665, 38063,
59802, 40817, 38213, 59803, 59801, 59722, 59976, 59723, 59975, 39338, 40794, 38097, 59628, 35257, 35963, 59631,
59630, 58225, 58231, 58224, 35686, 35139, 36707, 59618, 38544, 35775, 59617, 38468, 59616, 38872, 36715, 59025,
59875, 38362, 59599, 60018, 38602, 58995, 59600, 37054, 59601, 37473, 59602, 35446, 38741, 59604, 58998, 36984,
64498, 37058, 36074, 40516, 64499, 38645, 57591, 64365, 37059, 40518, 36950, 59598, 40519, 38129, 59596, 64495,
59593, 40400, 59594, 38395, 59595, 59597, 35223, 36475, 59583, 64496, 59581, 64497, 40371, 59585, 38102, 57844,
59586, 40375, 57847, 37274, 35137, 35296, 59554, 37570, 57921, 38859, 37801, 59548, 38820, 58220, 36015, 38907,
59520, 38778, 35542, 35444, 36221, 38068, 58219, 59522, 59521, 38245, 37522, 40838, 40837, 59523, 59995, 35736,
64101, 59386, 64473, 36220, 64469, 59996, 64476, 59997, 36763, 40884, 40882, 64463, 38252, 59384, 38365, 35241,
59355, 35187, 37598, 64447, 64448, 38516, 35834, 60019, 35695, 60020, 60021, 59309, 64445, 64446, 36741, 59307,
37194, 37193, 36781, 35042, 39829, 38857, 59311, 37099, 38128, 36692, 36969, 36782, 0, 59292, 59291, 64171,
35053, 59293, 38048, 36721, 38222, 58044, 59301, 59279, 57458, 38050, 38592, 59294, 59281, 59282, 59275, 37861,
37575, 59274, 35294, 40785, 40782, 37876, 59276, 38039, 37557, 37714, 37192, 59277, 59243, 59245, 38371, 59242,
58733, 59120, 36444, 59244, 59123, 59248, 59246, 35664, 38021, 59247, 36011, 59084, 59083, 37878, 38282, 38255,
37335, 40854, 36543, 35178, 59053, 37745, 59085, 36446, 36498, 37796, 36828, 59055, 59021, 38476, 37202, 59056,
59010, 59057, 59020, 59022, 36804, 36010, 59018, 36213, 59009, 36563, 59005, 58962, 35535, 64426, 59013, 36756,
+ 0, 36031, 59002, 58963, 59000, 37368, 58964, 37483, 58965, 40067, 40073, 37055, 35536, 59001, 37513, 36986,
37053, 58994, 40055, 58999, 36075, 58996, 58997, 64422, 58993, 35317, 40670, 57489, 37088, 37831, 35980, 57490,
58823, 40669, 58822, 37582, 36687, 37253, 58758, 40667, 38473, 58759, 36211, 40869, 58756, 0, 58757, 58762,
58765, 36546, 35479, 58763, 64409, 37828, 58051, 58050, 36854, 58595, 58047, 58600, 37267, 57424, 38997, 58596,
36052, 38216, 58569, 35520, 58557, 0, 64407, 58566, 58565, 58761, 58755, 58576, 37019, 58561, 64406, 0,
37495, 35685, 58772, 35803, 38568, 58560, 64403, 38606, 58519, 35286, 35485, 58523, 38803, 40783, 58525, 58501,
36934, 64385, 40668, 35955, 35216, 58502, 58503, 58496, 64387, 58494, 57940, 35533, 58504, 58497, 0, 58498,
58499, 58476, 58477, 36271, 38855, 58478, 35970, 58479, 35771, 40360, 58480, 40349, 37091, 58481, 36553, 58471,
+ 0, 36505, 36962, 39258, 35303, 39260, 58472, 38869, 58460, 36521, 58461, 37757, 36684, 35477, 35248, 0,
58468, 58463, 58328, 35200, 39586, 58464, 37049, 39588, 58329, 39587, 58330, 36443, 58253, 39590, 38327, 58331,
37753, 58258, 58259, 64092, 40833, 58260, 0, 58266, 37722, 58227, 58240, 36481, 34988, 58235, 40325, 58238,
+ 0, 58236, 58241, 58234, 40322, 58208, 37073, 38862, 36751, 35574, 38261, 58254, 64398, 39617, 58215, 58841,
37116, 58843, 58211, 58216, 58218, 38797, 35002, 58194, 38125, 0, 35723, 58839, 58191, 36681, 36028, 37223,
58180, 58186, 58192, 64394, 39781, 39782, 58181, 35951, 38652, 58189, 58193, 35657, 38344, 58176, 57750, 38641,
36199, 58108, 57749, 58099, 0, 58179, 38628, 37788, 37979, 58098, 58091, 58090, 58089, 58100, 59478, 38323,
37260, 64482, 58093, 59481, 40685, 64240, 58094, 37048, 58087, 58085, 40687, 58083, 35487, 35292, 36815, 58088,
64241, 35456, 58086, 39554, 58084, 58092, 58036, 37450, 38035, 38565, 59052, 36442, 58030, 58039, 58034, 59054,
58033, 58029, 64392, 58031, 58014, 37501, 37787, 57931, 37786, 37961, 36340, 36814, 36811, 39609, 0, 38235,
39606, 58038, 58008, 58009, 36309, 37706, 57487, 58003, 58010, 58016, 57479, 58006, 35910, 35720, 0, 58005,
58018, 57485, 37506, 37259, 58004, 57977, 57979, 57976, 57978, 59269, 38744, 36073, 35773, 39327, 39326, 35905,
57836, 37620, 37747, 59270, 58256, 59271, 57839, 35414, 57834, 38638, 57825, 64345, 37485, 37970, 38026, 38472,
35817, 38976, 37781, 57495, 37466, 57826, 35768, 57782, 57497, 35524, 38101, 57783, 0, 57784, 57780, 59498,
57785, 59499, 57779, 37776, 38618, 38064, 35704, 37047, 40792, 59501, 57781, 38591, 57718, 38118, 57712, 35311,
57714, 39141, 37728, 57716, 36957, 0, 57705, 57717, 57715, 36542, 57700, 57701, 64337, 57704, 57703, 38212,
38982, 36998, 37217, 37216, 64366, 35210, 57675, 57674, 57676, 0, 57576, 38868, 35797, 38138, 37993, 57677,
57679, 57678, 57577, 57537, 57538, 57536, 35056, 57579, 58505, 64347, 57530, 58572, 36587, 58571, 36851, 37830,
35767, 57529, 37547, 35986, 38027, 58578, 64348, 58589, 57519, 35301, 39158, 35725, 57439, 38596, 57418, 38580,
64333, 59529, 40952, 59827, 37704, 57444, 38530, 57410, 40949, 57448, 59828, 0, 35739, 37591, 40950, 40926,
35466, 57451, 40934, 40939, 40940, 57413, 40938, 57412, 0, 57421, 38766, 40933, 37354, 37336, 37709, 37463,
+ 0, 40935, 40905, 64330, 40894, 37617, 40900, 40327, 40907, 35066, 40897, 38731, 40908, 36713, 40901, 38759,
35511, 40906, 40877, 39793, 37777, 40904, 39791, 37108, 39792, 40874, 40898, 38796, 36679, 36484, 37812, 40868,
37829, 40825, 38116, 0, 64244, 57948, 38137, 36680, 40807, 38609, 0, 40809, 40808, 40826, 38519, 40377,
40376, 36733, 36586, 36451, 64237, 40810, 40344, 40378, 40366, 36799, 40686, 36472, 40693, 36599, 35474, 0,
35960, 37453, 38605, 40694, 40681, 59038, 59040, 36536, 39663, 59041, 36000, 35233, 35454, 35022, 39664, 40657,
40679, 40682, 40676, 37457, 39665, 37524, 35267, 38231, 40647, 40666, 40655, 58052, 40674, 36798, 60064, 58076,
58078, 40652, 36188, 37574, 37252, 40650, 38495, 58079, 40607, 40609, 35826, 40613, 40601, 40561, 37449, 40558,
35171, 37069, 40566, 37775, 40556, 0, 38541, 40554, 38865, 40562, 40552, 38535, 35486, 35274, 36477, 64220,
58592, 38492, 58534, 58574, 36210, 40513, 40441, 58579, 38798, 40444, 37265, 40443, 64221, 35781, 60002, 40433,
40437, 36018, 60003, 35273, 40434, 40436, 60004, 0, 36525, 40431, 40435, 40427, 64213, 35393, 40428, 40429,
38099, 35155, 36430, 36276, 36943, 38273, 35945, 64214, 58868, 64215, 58863, 58869, 39496, 40426, 40425, 40430,
40409, 40410, 35577, 58873, 59573, 37882, 37461, 35724, 36476, 37249, 35710, 0, 36731, 34990, 40387, 40386,
38003, 40389, 35763, 0, 59023, 38775, 40391, 40390, 40358, 40369, 59026, 40368, 59029, 40367, 0, 59027,
38228, 40370, 38761, 40357, 40372, 36847, 40353, 38002, 40354, 64580, 0, 40308, 59838, 35904, 37248, 64204,
35452, 59841, 0, 64581, 40316, 35323, 40281, 35729, 37361, 40277, 40788, 59821, 40280, 36179, 37081, 0,
36789, 40288, 38001, 40291, 58102, 35667, 37459, 40285, 40292, 40287, 40294, 40290, 35812, 40289, 38031, 35984,
40283, 38781, 40274, 40275, 40279, 37770, 40276, 36178, 37084, 35691, 40690, 40293, 38066, 37542, 37360, 40177,
35648, 40175, 40165, 35996, 39856, 40176, 39858, 40180, 40179, 40181, 40178, 38557, 35509, 0, 40146, 36579,
35940, 35411, 64184, 37539, 40143, 35757, 40025, 38838, 40145, 40099, 38218, 35319, 37477, 40097, 40098, 58546,
+ 0, 40094, 40096, 40065, 35055, 37755, 36069, 58537, 40070, 38268, 0, 58536, 40064, 40026, 40069, 38885,
36470, 64103, 40303, 0, 40027, 39927, 35758, 38367, 40028, 37563, 40029, 37752, 36288, 58778, 37243, 37553,
36041, 58775, 37611, 35505, 38333, 37966, 39922, 39923, 38024, 36171, 35506, 39924, 36022, 38755, 38728, 35572,
39926, 35649, 59605, 0, 37536, 35907, 39118, 39910, 39911, 36845, 59606, 59610, 39121, 59608, 38488, 36040,
39903, 38564, 37986, 39904, 58783, 36170, 36937, 0, 58779, 35498, 58782, 37446, 35792, 36740, 40922, 37251,
58774, 36168, 36278, 36169, 35728, 38569, 38388, 39902, 40920, 40924, 36279, 64174, 37767, 0, 64193, 40121,
39862, 36723, 37328, 39861, 35448, 40129, 40128, 39853, 39855, 35549, 40133, 64173, 39852, 39854, 39830, 39857,
39831, 37561, 38622, 59880, 0, 38069, 39832, 59885, 59881, 35271, 39818, 35780, 39816, 39820, 39817, 37962,
40651, 36946, 58766, 39821, 64170, 58768, 38846, 39668, 35935, 58769, 64160, 38522, 39667, 58767, 37765, 39671,
39655, 39670, 64161, 36683, 64162, 58308, 58307, 38351, 39656, 64159, 37050, 35051, 38020, 35268, 35766, 57531,
57533, 37593, 57532, 39651, 39650, 39652, 39653, 39654, 37209, 39627, 57534, 37763, 57926, 57925, 37736, 37764,
38071, 37579, 35201, 38385, 57927, 36295, 36842, 37735, 0, 39613, 39614, 39612, 36324, 39616, 39574, 39628,
39575, 36459, 39535, 37975, 39576, 39268, 35046, 36602, 36460, 38851, 36773, 35313, 39513, 57748, 57746, 57747,
34663, 39512, 39503, 35552, 35061, 39502, 34664, 37313, 39494, 39495, 35289, 36771, 38537, 36818, 0, 58563,
39500, 39499, 39414, 36312, 39490, 39416, 37744, 0, 39420, 64147, 0, 39488, 39417, 39405, 39403, 39517,
38561, 0, 39400, 39409, 39404, 36246, 36482, 0, 39407, 36036, 38589, 38106, 37298, 37356, 35750, 57552,
57553, 37868, 37456, 59212, 38030, 36690, 38509, 59211, 39364, 39357, 36700, 0, 37095, 59213, 39359, 39358,
36769, 36063, 39361, 38076, 39348, 37835, 39362, 37086, 36339, 39350, 35259, 38507, 57975, 36346, 39351, 35917,
39340, 37240, 39341, 38767, 57488, 39342, 39343, 36569, 60068, 0, 59603, 36089, 38620, 37806, 36718, 39334,
35496, 38577, 38049, 64136, 57835, 36767, 39335, 38373, 64135, 39332, 64379, 38517, 57837, 37562, 0, 38725,
38883, 38359, 34662, 38986, 39331, 39333, 39536, 34670, 36088, 39291, 38525, 39330, 39530, 35406, 39534, 36744,
37370, 39532, 39293, 37858, 0, 64131, 39294, 58348, 39272, 38496, 39273, 40945, 39274, 39275, 36839, 35521,
36554, 38615, 59844, 59845, 64129, 59849, 39253, 36425, 0, 39252, 39255, 39254, 37346, 36594, 39256, 39249,
39248, 39247, 35745, 39124, 0, 39250, 38508, 39236, 40796, 64125, 36766, 38843, 40795, 39235, 40797, 39237,
35789, 35276, 40579, 37462, 39232, 39233, 38223, 64121, 37805, 36547, 37276, 37284, 37603, 35828, 38059, 39159,
59370, 39108, 36830, 64459, 35669, 38074, 64501, 38880, 36058, 36940, 64109, 36454, 59642, 36503, 35262, 64105,
59643, 37347, 38879, 35016, 39079, 37972, 57710, 35702, 57709, 38331, 38875, 39103, 35260, 37974, 35189, 37857,
36033, 38482, 33954, 35314, 39624, 33965, 33956, 33187, 33186, 33967, 33955, 33117, 0, 33966, 33957, 33978,
33116, 33189, 33188, 33125, 33126, 36287, 36162, 33127, 33128, 60051, 60052, 38894, 60049, 58838, 64150, 60053,
60054, 37299, 58837, 60056, 58840, 60055, 59564, 59562, 59563, 58831, 59565, 0, 59566, 38890, 59567, 59568,
35195, 37063, 38073, 64586, 59999, 60000, 0, 59526, 60001, 59525, 59524, 57840, 59527, 35923, 59321, 38345,
59322, 37079, 57842, 37855, 38292, 0, 38477, 57843, 59317, 35443, 36567, 35755, 64378, 39630, 59255, 59318,
35469, 59254, 59259, 38832, 36196, 59258, 59251, 36005, 59257, 37713, 59260, 38721, 59253, 35024, 59252, 34977,
59214, 59256, 38752, 59217, 59216, 39761, 59215, 0, 59064, 59219, 59218, 59066, 38644, 59070, 0, 59065,
59067, 59072, 38501, 59068, 59069, 64427, 35404, 37605, 59035, 40334, 36527, 40338, 59037, 59036, 38280, 38080,
37771, 59039, 35692, 39010, 35417, 36826, 58858, 36822, 58856, 64418, 0, 64421, 38791, 58853, 58986, 39787,
58855, 37051, 37022, 58829, 58836, 39780, 39777, 58824, 36720, 36604, 35925, 36596, 35416, 37340, 58825, 58842,
35185, 58803, 36821, 58826, 0, 58808, 58809, 64250, 35401, 0, 35681, 58734, 37985, 58807, 38765, 40878,
58292, 58735, 58736, 58746, 58706, 58695, 58295, 58740, 58699, 58294, 58293, 35218, 35284, 37859, 38470, 58700,
58703, 58602, 38570, 35964, 35802, 0, 58509, 58605, 35304, 58603, 58598, 58601, 37502, 64096, 58604, 40332,
+ 0, 38773, 58593, 35415, 58518, 58599, 37305, 58545, 40339, 34656, 58552, 58541, 58553, 34659, 35287, 35534,
58543, 58359, 35244, 58550, 37815, 57472, 64405, 36520, 35769, 57470, 38635, 57468, 58437, 37980, 0, 58325,
37327, 37470, 58318, 58324, 39370, 36203, 38639, 38613, 58319, 58320, 38771, 38998, 58321, 36204, 58316, 36562,
58315, 35531, 58440, 58441, 58312, 58317, 36519, 33162, 36590, 33161, 58313, 58439, 38524, 38787, 58286, 58288,
58981, 38789, 58287, 58290, 58289, 58984, 38770, 58985, 58291, 58262, 38140, 58261, 58263, 58264, 39751, 58265,
37045, 36463, 57520, 36462, 58267, 58268, 64399, 37825, 36932, 37205, 58244, 36001, 57521, 58246, 58247, 38730,
+ 0, 58243, 58245, 38089, 40154, 58237, 37784, 40158, 58232, 57937, 58195, 37278, 37184, 35953, 57938, 36682,
35952, 37297, 58200, 37262, 39507, 38722, 58213, 37789, 58190, 58187, 38316, 35399, 37090, 38226, 37843, 36006,
38070, 36739, 58178, 58199, 36561, 36200, 36486, 35721, 38324, 58177, 58104, 35530, 58105, 58269, 58106, 58270,
36485, 37104, 58107, 35950, 37042, 35913, 35722, 35788, 35912, 58081, 0, 35942, 40568, 37581, 40317, 38322,
35453, 37000, 0, 38574, 37246, 36985, 38276, 40321, 58012, 35478, 57986, 57985, 37350, 57989, 57981, 37041,
57990, 38823, 38611, 57991, 37564, 57992, 40616, 35515, 37258, 0, 57721, 57787, 36516, 36269, 36738, 38056,
37783, 57722, 38088, 37577, 36291, 38754, 57724, 38831, 57692, 57690, 37499, 37028, 37731, 38738, 36194, 36956,
37833, 40689, 0, 37482, 39346, 40691, 37548, 35302, 57685, 36441, 64238, 35225, 57683, 33227, 38768, 33228,
37364, 38369, 57684, 57574, 64359, 64168, 0, 64361, 64360, 57516, 33160, 64091, 64362, 36759, 37754, 57517,
38352, 38085, 39744, 33252, 57518, 38006, 57481, 36164, 38017, 57477, 57480, 36806, 38041, 38095, 35519, 38904,
57484, 33268, 36559, 35947, 33267, 40890, 33266, 38559, 37584, 40912, 36749, 36024, 59983, 40927, 37599, 40921,
40879, 40881, 59987, 35161, 59988, 59986, 36191, 38993, 0, 35420, 0, 38274, 64252, 36678, 40876, 0,
40875, 40870, 33265, 40873, 33164, 33165, 35464, 39623, 40872, 37992, 40846, 40843, 38784, 33190, 35222, 64247,
37717, 37566, 36302, 38896, 0, 37847, 40844, 40804, 40805, 35929, 36480, 38782, 39301, 64132, 40806, 38897,
40791, 40790, 40793, 35676, 0, 36745, 35796, 35516, 35394, 36267, 0, 40576, 0, 40592, 35457, 34994,
40585, 40590, 40594, 36187, 37774, 36706, 0, 40587, 36747, 40586, 57557, 40582, 57556, 37479, 35011, 40438,
64218, 35029, 37068, 64207, 40439, 35697, 37097, 36538, 38727, 39809, 40420, 0, 64211, 37039, 40394, 40395,
37103, 35707, 38511, 38326, 39804, 37060, 38886, 57564, 38251, 35432, 36310, 40355, 40350, 36436, 40346, 57566,
40345, 64352, 0, 39917, 38539, 37969, 39916, 0, 64203, 37811, 38825, 36300, 37460, 40313, 39918, 37082,
+ 0, 36180, 36996, 35206, 37211, 40311, 35684, 38392, 58865, 34674, 34675, 37615, 38374, 58866, 58867, 38549,
37277, 40282, 35231, 37514, 40150, 37572, 38375, 64157, 39632, 40140, 40141, 40142, 59261, 40136, 40149, 40137,
40148, 59262, 40126, 36508, 36236, 40130, 37332, 36177, 40112, 36948, 40090, 57830, 40093, 40095, 64189, 57832,
57929, 57928, 36539, 64190, 40101, 37614, 40091, 40076, 40086, 40084, 60013, 38046, 40081, 0, 60014, 60016,
40080, 38902, 60017, 40082, 35229, 37034, 40040, 40039, 35937, 37330, 0, 40045, 40043, 37486, 40042, 38821,
36067, 40035, 35936, 0, 39592, 39593, 38214, 64185, 39595, 36298, 38230, 37540, 38250, 40036, 40031, 59471,
37782, 36285, 37273, 40032, 40033, 37576, 40034, 35269, 39774, 40019, 40018, 36785, 40006, 40005, 40001, 36537,
39908, 39773, 35993, 40007, 40008, 37535, 0, 40009, 39907, 39906, 39909, 64167, 37609, 36578, 39811, 35569,
37840, 38567, 39812, 0, 39813, 34999, 36038, 38264, 37033, 35023, 39376, 39750, 64142, 36021, 39755, 39756,
39377, 39753, 38533, 64165, 36296, 35726, 0, 36776, 39745, 37952, 38108, 38607, 59805, 33178, 33177, 59804,
38578, 37956, 59806, 39660, 39754, 37349, 59807, 37718, 37310, 38262, 39661, 39662, 35227, 39657, 58816, 58815,
58745, 0, 38747, 35407, 58820, 39367, 36711, 37309, 39658, 38633, 64158, 38317, 36593, 59747, 59748, 36225,
39637, 39631, 39634, 39636, 64506, 39605, 36260, 36163, 35423, 39607, 36327, 35408, 35297, 58737, 58738, 39608,
39415, 64152, 36433, 39378, 39492, 35060, 39491, 0, 38548, 36275, 35705, 38726, 37231, 38077, 36603, 64141,
57797, 57798, 39371, 37549, 38864, 35553, 36090, 35989, 36316, 38029, 37317, 36020, 38309, 39316, 39314, 37359,
37604, 39309, 40267, 38299, 37285, 40265, 0, 36333, 39310, 39311, 37199, 35493, 39308, 39278, 0, 39276,
38587, 39277, 0, 38265, 39279, 39280, 39281, 37758, 39261, 59207, 64128, 37884, 59209, 59206, 37203, 39263,
39264, 38058, 36086, 39002, 39265, 39154, 38753, 35558, 38096, 37850, 39153, 39157, 0, 37020, 38860, 39156,
35962, 37602, 39143, 64117, 38381, 37484, 39139, 35985, 0, 39136, 39144, 39138, 38863, 39145, 39008, 37999,
+ 0, 38229, 39142, 0, 38382, 0, 35252, 35927, 37283, 35298, 39146, 64118, 58025, 58026, 64097, 36722,
58023, 58021, 64115, 39127, 39120, 64111, 58015, 64114, 0, 39123, 0, 39116, 35492, 64113, 35743, 39122,
35019, 39114, 0, 64112, 38881, 58692, 36504, 37583, 39115, 38038, 37441, 39112, 58702, 58694, 35778, 58696,
37511, 35018, 37601, 36698, 35983, 39105, 38844, 35462, 0, 37955, 64106, 38336, 35938, 64104, 40078, 39074,
59886, 0, 37510, 59887, 37820, 59884, 59883, 40680, 40772, 40771, 39019, 35240, 59862, 59858, 59856, 59855,
38325, 57429, 35167, 57428, 57430, 59866, 38891, 38795, 36423, 59577, 57433, 37732, 59576, 58795, 33185, 33184,
39380, 38343, 37015, 59574, 37196, 39639, 59378, 37476, 59372, 59377, 35315, 38593, 36843, 37558, 59379, 59376,
38889, 33176, 33102, 36056, 64236, 64458, 64452, 59340, 64454, 40671, 40664, 59373, 36742, 40677, 59339, 40675,
59338, 37010, 37351, 59089, 59090, 39866, 59092, 37281, 36328, 59091, 35556, 58554, 59094, 58544, 59093, 36827,
59060, 37371, 58764, 58556, 58760, 58542, 38044, 35305, 36235, 39084, 59061, 58991, 0, 58992, 58990, 58540,
36054, 58548, 38751, 58555, 58549, 36495, 37958, 35734, 58547, 38643, 37225, 36997, 58980, 64420, 38232, 35177,
36966, 37520, 36824, 58849, 38740, 38083, 64245, 58850, 58851, 58793, 0, 38370, 58852, 58797, 36286, 58800,
58799, 38072, 0, 40342, 58791, 38604, 58749, 37024, 58747, 58750, 38247, 38104, 58754, 35422, 37076, 58753,
36557, 59101, 58748, 58752, 58693, 35441, 37189, 59102, 58697, 36422, 36964, 35919, 38642, 57807, 38647, 36754,
58562, 37816, 57806, 57805, 58567, 36490, 37494, 0, 58564, 38471, 58570, 35038, 58473, 58474, 35152, 39768,
58475, 35037, 58354, 38263, 37471, 37001, 58309, 39769, 0, 39764, 38007, 58310, 37337, 35237, 58311, 0,
35555, 58304, 58305, 58298, 39766, 39767, 58306, 58301, 38786, 58302, 58299, 36777, 38571, 0, 35144, 38210,
57956, 57957, 37492, 57952, 38853, 57953, 38025, 57959, 36960, 57950, 36808, 37505, 38899, 57790, 57951, 57469,
57789, 57788, 38139, 35143, 35525, 36007, 57777, 38005, 0, 36737, 38526, 57426, 35181, 0, 35190, 57751,
57752, 57778, 57419, 37546, 57416, 57756, 57753, 57754, 57755, 0, 57757, 57711, 57713, 37730, 38241, 57427,
36807, 64332, 57686, 57720, 57691, 57431, 57719, 57689, 57688, 40384, 35397, 57687, 57558, 35032, 35436, 35188,
+ 0, 57560, 40892, 64351, 57559, 40895, 57562, 57561, 57547, 38849, 38736, 38737, 0, 35512, 36437, 64349,
57550, 37846, 57551, 35214, 57549, 37526, 37964, 35944, 35977, 36003, 57548, 36047, 57422, 57535, 0, 57417,
37110, 0, 35815, 35459, 37215, 64449, 36253, 57437, 57435, 64451, 0, 57438, 37853, 35426, 57441, 36955,
64324, 36734, 57434, 38307, 0, 36268, 64323, 40889, 40903, 37721, 64325, 35765, 0, 0, 40853, 40858,
36947, 0, 38219, 37106, 38033, 40852, 38117, 40851, 35906, 35573, 37957, 35243, 33154, 34705, 36281, 40845,
40847, 40658, 33157, 33158, 38992, 40661, 33249, 33250, 64235, 0, 0, 36953, 40660, 38016, 40634, 35785,
+ 0, 40626, 40628, 40625, 36186, 35484, 38991, 35449, 40631, 38294, 40630, 37320, 40570, 35476, 40577, 40636,
37214, 39874, 40627, 40640, 40639, 35580, 64175, 40624, 38390, 64100, 38599, 40599, 35579, 36994, 40606, 40591,
64231, 35249, 40580, 39600, 39603, 40573, 35934, 37105, 0, 40597, 40581, 35434, 36266, 64088, 34699, 35433,
36301, 36337, 37565, 40524, 38990, 34700, 39533, 39531, 38493, 39589, 37545, 40525, 35578, 40379, 40380, 40382,
40381, 40383, 35324, 0, 36181, 36509, 40299, 38394, 37037, 37793, 58714, 36471, 40300, 35010, 38091, 58701,
40295, 37316, 40123, 64194, 37242, 40118, 0, 40115, 40116, 0, 36580, 40119, 40122, 38111, 40059, 40106,
40110, 38627, 58205, 40103, 35242, 35801, 38122, 37769, 40108, 64172, 37261, 37210, 35554, 35202, 39851, 38566,
35567, 37854, 38386, 39647, 39645, 0, 0, 39669, 37236, 59738, 36461, 36976, 59740, 37235, 39649, 38520,
59739, 37808, 59742, 59745, 35992, 37325, 0, 0, 39516, 39615, 39618, 39526, 37200, 0, 64149, 39528,
+ 0, 36161, 39518, 37533, 36710, 0, 36582, 36595, 39240, 36758, 39238, 38078, 37229, 64143, 37790, 39381,
+ 0, 39306, 39239, 39241, 37031, 36348, 35988, 39307, 36456, 36239, 35748, 58271, 0, 64400, 38330, 37300,
35823, 37716, 58272, 58273, 58274, 35987, 36453, 36452, 37308, 39101, 38260, 37093, 59121, 59122, 38776, 33111,
39102, 39104, 33229, 37797, 33245, 33230, 59777, 0, 59780, 33246, 33208, 35777, 59779, 33209, 35559, 36016,
59781, 64500, 35560, 0, 0, 37726, 35831, 38834, 38878, 35911, 0, 37344, 58432, 0, 59556, 35403,
37007, 35136, 36983, 36764, 35543, 59553, 59530, 0, 0, 38022, 35013, 59555, 0, 59528, 59488, 59532,
59531, 59485, 59484, 39566, 0, 39565, 36832, 37800, 59483, 64481, 0, 39568, 35418, 36988, 59333, 0,
59334, 59469, 59470, 37569, 59335, 38799, 37762, 36694, 59231, 59228, 39497, 59232, 34976, 36564, 59233, 35663,
35922, 59128, 64434, 37627, 0, 0, 59200, 59204, 59201, 59132, 36689, 59202, 59047, 59048, 0, 35981,
59049, 58979, 0, 59050, 59051, 58854, 38475, 58859, 0, 37085, 38305, 0, 58786, 58861, 64417, 58860,
36212, 58827, 35039, 0, 58806, 58810, 58805, 38236, 0, 58741, 58828, 58742, 36566, 0, 58744, 58618,
37472, 0, 35957, 35425, 39022, 37792, 38291, 64412, 35184, 58698, 58516, 58515, 57968, 57969, 36853, 0,
58521, 58517, 58520, 58511, 57970, 58512, 35438, 36577, 35818, 37527, 35400, 34992, 58453, 37839, 58449, 0,
58507, 58510, 37997, 38278, 36963, 38540, 38215, 58345, 39520, 39525, 36817, 39521, 38217, 0, 58346, 58344,
35215, 35532, 0, 37866, 58222, 35528, 0, 58061, 58229, 58223, 58230, 58062, 39763, 38987, 58063, 58066,
58020, 38221, 37995, 38052, 37785, 39765, 35800, 58019, 58017, 36517, 38067, 35427, 0, 57850, 57845, 35968,
39324, 38827, 57851, 57846, 36999, 39320, 37826, 40440, 57804, 38514, 40512, 57801, 57578, 37852, 57802, 40442,
57581, 36072, 35180, 57583, 57501, 37008, 57580, 0, 57503, 0, 57486, 57502, 38734, 64346, 57504, 40943,
40917, 40937, 38597, 40910, 37778, 40331, 40932, 40335, 36512, 40956, 40855, 35943, 38464, 0, 40857, 36335,
40866, 64249, 40864, 38575, 40859, 40834, 40835, 40665, 0, 35651, 40672, 40611, 0, 40836, 0, 40678,
38131, 40684, 37018, 40621, 35473, 35999, 40432, 35250, 38995, 64217, 37040, 36044, 36795, 38513, 40385, 38312,
37489, 37712, 40347, 40388, 64205, 38257, 40348, 0, 38287, 37314, 37988, 36418, 35674, 39619, 40271, 40278,
36788, 39620, 0, 0, 40167, 40272, 37987, 40168, 36263, 40166, 40164, 40163, 40170, 40162, 40172, 38318,
+ 0, 0, 37810, 39887, 35941, 39886, 40160, 40155, 39885, 40161, 38903, 40159, 37768, 39864, 40156, 39313,
40153, 38485, 64198, 40152, 40157, 38729, 36228, 0, 35507, 39312, 0, 35192, 40100, 36995, 37977, 34987,
37823, 37541, 0, 36468, 64186, 37064, 37711, 37329, 0, 40052, 35658, 36467, 38266, 38075, 38346, 38079,
39303, 0, 38808, 39304, 39905, 35571, 37766, 39305, 36672, 35503, 37512, 37608, 34998, 35672, 38387, 0,
36544, 39800, 39841, 58871, 39801, 58872, 39802, 35671, 58870, 39803, 38756, 39805, 0, 38573, 0, 39850,
35931, 39746, 0, 39510, 39511, 37348, 36534, 36458, 35141, 39508, 39514, 35472, 36230, 36457, 64485, 39387,
39140, 39149, 59491, 59489, 37233, 37366, 36034, 59493, 38011, 39093, 57541, 59896, 39094, 0, 59893, 39095,
59899, 0, 59900, 36972, 58728, 39080, 36838, 39081, 35251, 0, 0, 58433, 35811, 36078, 38631, 60032,
58364, 60033, 60034, 36980, 60035, 35211, 60036, 60037, 60038, 59891, 57476, 38320, 59889, 57475, 35483, 40774,
59888, 36528, 35239, 59782, 40773, 59784, 59783, 40770, 0, 64200, 59785, 59787, 59786, 59749, 38114, 40363,
35421, 59724, 0, 38621, 37998, 59750, 59751, 59725, 38779, 59639, 35169, 36846, 40109, 37845, 59641, 37352,
35450, 35451, 59640, 35183, 0, 0, 59637, 59634, 38819, 37871, 38256, 38794, 59638, 0, 35146, 0,
37089, 36532, 35445, 59558, 0, 59559, 59557, 35972, 59387, 36315, 36833, 64491, 64094, 39006, 0, 37863,
59461, 37748, 58529, 58538, 58539, 59460, 59462, 64466, 34985, 38478, 64470, 35442, 64468, 59241, 64464, 0,
64465, 36314, 59240, 59112, 59249, 37963, 0, 59111, 59114, 34984, 35735, 58582, 59118, 58591, 38296, 58448,
+ 0, 0, 58451, 58450, 58022, 0, 58024, 38499, 58454, 36206, 35047, 58027, 36326, 58028, 38065, 0,
36752, 0, 38008, 37996, 0, 38123, 58285, 40171, 38349, 35283, 0, 57930, 35926, 58035, 0, 58032,
57841, 58037, 35679, 35654, 36483, 35437, 38120, 57849, 35151, 57848, 36330, 0, 39025, 38576, 0, 57838,
+ 0, 57792, 57794, 57795, 57545, 57542, 57791, 0, 0, 38610, 57544, 57546, 36046, 38850, 36803, 0,
+ 0, 37464, 64327, 36434, 40880, 40914, 40886, 64320, 39845, 0, 38876, 39846, 37779, 37824, 40888, 0,
64251, 36801, 0, 40812, 36930, 38735, 40811, 40885, 0, 40623, 40602, 40622, 40813, 40615, 40603, 40406,
40619, 0, 40620, 0, 35576, 0, 40408, 40333, 40407, 35998, 40330, 40337, 0, 40312, 36791, 0,
40306, 37862, 37968, 39749, 64164, 37315, 39601, 0, 38487, 36259, 64151, 37458, 37737, 0, 39598, 37592,
34979, 38249, 39489, 57829, 39418, 36004, 36307, 39413, 39419, 36294, 37030, 39288, 36729, 0, 0, 39289,
+ 0, 37532, 38845, 37760, 35670, 39245, 39246, 35974, 35245, 35568, 64123, 39784, 39783, 39244, 36432, 38133,
39161, 34657, 34667, 33183, 33182, 34666, 34660, 0, 33179, 0, 34668, 33181, 33180, 64064, 64065, 64066,
64067, 64068, 64069, 64070, 64071, 64072, 64073, 64074, 64075, 64076, 64077, 64078, 64079, 64080, 64081, 64082,
64083, 33742, 33743, 0, 33744, 33745, 33746, 33747, 33748, 33749, 33750, 33710, 33711, 0, 33712, 33713,
33714, 33715, 33716, 33717, 33718, 59621, 0, 0, 59622, 59221, 59623, 59220, 59222, 59624, 59534, 59533,
59535, 59223, 37804, 39771, 39775, 39772, 59536, 35541, 64488, 35540, 59515, 0, 59516, 0, 59517, 59518,
37589, 35810, 59467, 64480, 36709, 0, 37818, 37474, 59463, 64095, 58588, 35312, 64408, 38772, 36935, 58970,
58531, 58530, 38824, 58528, 58527, 37507, 36489, 37369, 58533, 35770, 37062, 39013, 38572, 58357, 37074, 58356,
+ 0, 0, 58352, 58355, 58350, 0, 58353, 38469, 58341, 58343, 58342, 38051, 0, 37879, 0, 39005,
38055, 58065, 38132, 0, 0, 57920, 38529, 58067, 38906, 38379, 57852, 0, 39363, 35049, 57670, 57671,
57669, 39290, 60067, 35779, 38258, 57673, 57672, 64342, 64343, 0, 38905, 57466, 0, 57482, 0, 37111,
57465, 37727, 35031, 64098, 64242, 0, 64243, 40298, 34981, 0, 38053, 36289, 40781, 40555, 40553, 36949,
35275, 40551, 40557, 40563, 0, 64226, 40526, 40527, 38616, 0, 38562, 38550, 38523, 36420, 40529, 37012,
+ 0, 40392, 0, 37038, 37703, 0, 38270, 40393, 40352, 0, 40286, 0, 40104, 40102, 40356, 37241,
40351, 0, 0, 40092, 36435, 40053, 36469, 38489, 38490, 0, 0, 35230, 40058, 64187, 35655, 36039,
39798, 35447, 0, 37508, 39799, 39776, 37303, 36859, 39778, 0, 36535, 39779, 38012, 35566, 39553, 36329,
+ 0, 0, 35565, 0, 39556, 39552, 39555, 39395, 0, 35706, 36993, 0, 38315, 39393, 39389, 36065,
60015, 36237, 38603, 38531, 39925, 0, 40832, 38555, 59850, 59847, 59846, 59848, 0, 38045, 0, 35966,
37322, 35191, 35820, 0, 35821, 59741, 59743, 59744, 0, 0, 59746, 59494, 35776, 35774, 59496, 64486,
59482, 59476, 64487, 0, 59475, 37270, 59103, 0, 59104, 38283, 58955, 64432, 35662, 36491, 37984, 58956,
58718, 35439, 0, 40784, 40769, 0, 36755, 58724, 58716, 58721, 37268, 0, 64410, 58720, 58691, 0,
38297, 58619, 64411, 58580, 58490, 58489, 58492, 35975, 36511, 58491, 35795, 58493, 58233, 58242, 35234, 58250,
58249, 57831, 64376, 38554, 0, 0, 37749, 36308, 35693, 57739, 57740, 57741, 36026, 57742, 0, 38822,
57738, 35786, 0, 35236, 36306, 57523, 57522, 38510, 57478, 57483, 39633, 57524, 35212, 39638, 40683, 64341,
64239, 40688, 40692, 0, 40550, 35764, 38136, 0, 40541, 40514, 40547, 40546, 36748, 40515, 0, 38762,
38040, 38393, 36556, 40320, 0, 40318, 0, 0, 37016, 37610, 38391, 37720, 0, 0, 36173, 0,
38267, 39591, 34995, 36317, 36858, 39549, 0, 39547, 35932, 39548, 39537, 39550, 39539, 36774, 35154, 37571,
39538, 39542, 39543, 35179, 36190, 40871, 39541, 39540, 35990, 39529, 39527, 37234, 35689, 35754, 0, 39524,
39522, 39515, 35499, 0, 35564, 35461, 39523, 39519, 39339, 0, 37032, 39336, 35790, 0, 39337, 35497,
64124, 39243, 59346, 59345, 0, 39242, 36856, 38342, 59347, 59337, 59336, 0, 36217, 0, 36243, 36447,
36592, 0, 37004, 0, 59331, 36530, 59332, 0, 59237, 59236, 35961, 59239, 59095, 0, 64431, 59097,
59099, 58487, 59100, 37319, 38037, 36029, 58486, 37188, 58007, 0, 58011, 58013, 57980, 35909, 36345, 0,
+ 0, 35719, 38769, 35717, 0, 57572, 38813, 64357, 0, 38830, 57540, 37451, 57539, 0, 0, 38996,
38018, 37525, 37355, 64336, 34671, 34672, 34673, 37027, 35971, 37367, 57425, 37978, 0, 0, 57432, 40928,
64326, 40923, 0, 64329, 37044, 40915, 35465, 36303, 36802, 40891, 36705, 35207, 64201, 40328, 0, 37288,
+ 0, 38760, 36426, 40305, 0, 40307, 39894, 64180, 64181, 38884, 37011, 39895, 39892, 39882, 64179, 0,
36277, 35159, 35501, 0, 39752, 0, 38595, 38224, 33269, 33270, 0, 33163, 33149, 33124, 33123, 33100,
+ 0, 33271, 33169, 33170, 64084, 33104, 64085, 33167, 60046, 57942, 0, 0, 59096, 59627, 59854, 59853,
59852, 0, 0, 34993, 37841, 59330, 36693, 36574, 38010, 37521, 59130, 0, 58812, 0, 59131, 59129,
58814, 58813, 37092, 0, 39000, 58776, 0, 58777, 58484, 36209, 58485, 38090, 57822, 58500, 0, 57823,
38581, 57824, 57508, 0, 37596, 38785, 57510, 57509, 35395, 36954, 40883, 40373, 0, 0, 37616, 40374,
40336, 38098, 40304, 37245, 33212, 33213, 0, 0, 33210, 33211, 59644, 59712, 0, 59714, 59713, 36968,
59267, 0, 36523, 59268, 59062, 38238, 59063, 58056, 59071, 57796, 58060, 58057, 57793, 36958, 64338, 57464,
37465, 57467, 57462, 40946, 0, 57409, 35209, 37254, 38828, 40828, 40827, 36850, 37107, 40830, 39896, 35570,
39848, 35550, 39897, 39849, 34655, 34669, 0, 0, 34658, 34693, 34694, 34695, 34696, 34697, 64229, 37580,
37832, 35176, 35009, 36750, 36174, 38758, 38054, 39919, 38332, 39920, 34686, 34703, 34702, 34701, 34640, 34641,
34642, 34643, 33193, 33194, 33192, 33195,
]
CP932へのチェックと変換の関数(Python)
def is_uxcp932(c):
if (c < 0) or (c >= 0x10000):
return False
p = UxCP932_VALID_HI_TABLE[(c >> 8) & 0xff]
if p == 0:
return False
b = UxCP932_VALID_LO_TABLE[(p << 3) + ((c >> 5) & 7)]
return (((b >> (c & 31)) & 1) != 0)
def to_uxcp932(c):
p = UxCP932_VALID_HI_TABLE[(c >> 8) & 0xff]
q = UxCP932_SPARSE_HI_TABLE[(p << 4) + ((c >> 4) & 15)]
return UxCP932_SPARSE_LO_TABLE[q + (c & 15) - 16]
参照表を作るプログラム(Python)
#!/usr/bin/env python3
import re
####
class SparseMatrixToLinear:
def __init__(self):
self.data = []
self.part = []
def append(self, code, data):
send = len(data)
dlen = len(self.data)
while send > 0:
if data[send - 1] >= 0:
break
send -= 1
if send == 0:
return
stop = 0
while stop < send:
if data[stop] >= 0:
break
stop += 1
part = data[stop:send]
self.part.append([len(part) - part.count(0), code, stop, part])
def build(self):
for part in sorted(self.part, reverse=True):
self.build_store(part)
for i in range(len(self.data)):
if self.data[i] < 0:
self.data[i] = 0
def build_store(self, part):
z0, code, stop, data = part
slen = len(data)
dpos = 0
loop = True
while loop:
loop = False
try:
dpos = self.data.index(-1, dpos + 1)
except ValueError:
dpos = len(self.data)
break
qend = len(self.data)
for i in range(slen):
s = data[i]
if s < 0:
continue
qpos = i + dpos
if qpos >= qend:
break
d = self.data[qpos]
if d < 0:
continue
if s != d:
loop = True
break
part.append(dpos - stop)
for i in range(slen):
s = data[i]
qpos = i + dpos
if qpos >= len(self.data):
self.data.append(s)
continue
if s >= 0:
self.data[qpos] = s
####
def from_binary_list(data):
r = 0
for i in range(len(data)):
r |= (data[i] << i)
return r
def gen_slice(data, count):
r = []
for i in range(0, len(data), count):
r.append(data[i:i+count])
return r
####
def get_map_source(data):
r = []
for d in data:
r.append(d[0])
return r
def get_map_target(data):
r = []
for d in data:
r.append(d[1])
return r
def set_head_plus(s):
if s[0] == ' ':
return ('+' + s[1:])
return s
def make_linear_table(data, size):
r = [-1] * size
for d in data:
r[d[0]] = d[1]
return r
def make_valid_table(data, width, height, zswap=False):
mark = [0] * (width * height)
for d in data:
mark[d] = 1
h = []
l = []
hn = {}
for line in gen_slice(mark, width):
t = []
s = ''
for v in line:
t.append(v)
s += str(v)
if s not in hn:
hn[s] = len(hn)
l.append(t)
n = hn[s]
h.append(n)
def empty(l): return (sum(l) == 0)
if zswap and (not empty(l[0])) and empty(l[1]):
t = l[0]
l[0] = l[1]
l[1] = t
for i in range(len(h)):
v = h[i]
if v == 0:
h[i] = 1
elif v == 1:
h[i] = 0
return [h, l]
def make_sparse_table_sb(vtable, data, wline, wslice):
raise NotImplemented
def make_sparse_table_ub(vtable, data, wline, wslice):
hf = tuple(filter(lambda x: x != 0, vtable[0]))
if len(hf) != len(set(hf)):
raise Exception('invalid: vtable')
sparse = SparseMatrixToLinear()
wstep = int(wline / wslice)
hi = vtable[0]
for i in range(len(hi)):
h = hi[i]
if h == 0:
continue
line = data[i]
code = h * wstep
for part in gen_slice(line, wslice):
sparse.append(code, part)
code += 1
sparse.build()
sh = [0] * ((max(hi) + 1) * wstep)
for part in sparse.part:
sh[part[1]] = wslice + part[4]
return [sh, sparse.data]
def make_valid_and_sparse(data, code_size, line_size, slice_size):
if (code_size % line_size) != 0:
raise Exception('invalid line size: code(%d) %% line(%d) != 0' % (code_size, line_size))
if (line_size % slice_size) != 0:
raise Exception('invalid line size: line(%d) %% slice(%d) != 0' % (line_size, slice_size))
line_count = int(code_size / line_size)
valid = make_valid_table(get_map_source(data), line_count, line_size, True)
table = gen_slice(make_linear_table(data, code_size), line_size)
sparse = make_sparse_table_ub(valid, table, line_size, slice_size)
return (valid, sparse)
####
def make_reverse_list(data):
l = []
for s, u in data:
l.append([u, s])
m = []
def check(u):
if u in m:
return False
m.append(u)
return True
return list(filter(check, sorted(l)))
def read_mapping_file(path, nonull=False):
RE = re.compile('^(?P<s>0x[0-9A-Fa-f]+)\s+(?P<u>0x[0-9A-Fa-f]+)')
r = []
for line in open(path).readlines():
if line[0] == '#':
continue
m = RE.match(line)
if not m:
continue
s = int(m.group('s'), 16)
u = int(m.group('u'), 16)
r.append([s, u])
if nonull and r[0] == [0, 0]:
del r[0]
return r
def write_valid(out, data, sym_h, sym_l):
hi, lo = data
hfmt, lfmt = '%2d', '%#010x'
out.write(sym_h + ' = [\n')
for line in gen_slice(hi, 16):
s = ', '.join([(hfmt % v) for v in line])
out.write(' %s,\n' % set_head_plus(s))
out.write(']\n')
out.write(sym_l + ' = [\n')
for line in lo:
s = ', '.join([(lfmt % from_binary_list(part))
for part in gen_slice(line, 32)])
out.write(' %s,\n' % set_head_plus(s))
out.write(']\n')
def write_sparse(out, data, sym_h, sym_l):
def afmt(l): return ('%' + ('%d' % len('%d' % max(l))) + 'd')
hi, lo = data
hfmt, lfmt = afmt(hi), afmt(lo)
out.write(sym_h + ' = [\n')
for line in gen_slice(hi, 16):
s = ', '.join([(hfmt % v) for v in line])
out.write(' %s,\n' % set_head_plus(s))
out.write(']\n')
out.write(sym_l + ' = [\n')
for line in gen_slice(lo, 16):
s = ', '.join([(lfmt % v) for v in line])
out.write(' %s,\n' % set_head_plus(s))
out.write(']\n')
def dump_valid(out, data, code_size, line_size):
table = [0] * code_size
for d in data:
table[d] = 1
table = [('%064x' % from_binary_list(tuple(reversed(line)))) for line in gen_slice(table, line_size)]
for i in range(len(table)):
out.write('%02x: %s\n' % (i, table[i]))
return
#!/usr/bin/env python3
import sys
from make_table import *
cp2u_map = read_mapping_file('CP932.txt')
u2cp_map = make_reverse_list(cp2u_map)
valid, sparse = make_valid_and_sparse(u2cp_map, 65536, 256, 16)
out = sys.stdout
write_valid(out, valid, 'UxCP932_VALID_HI_TABLE', 'UxCP932_VALID_LO_TABLE')
write_sparse(out, sparse, 'UxCP932_SPARSE_HI_TABLE', 'UxCP932_SPARSE_LO_TABLE')