Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_PDF417.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_PDF417Compaction.h"\r
9 #include "include/BC_PDF417BarcodeRow.h"\r
10 #include "include/BC_PDF417BarcodeMatrix.h"\r
11 #include "include/BC_PDF417ErrorCorrection.h"\r
12 #include "include/BC_PDF417HighLevelEncoder.h"\r
13 #include "include/BC_PDF417.h"\r
14 FX_INT32 CBC_PDF417::START_PATTERN = 0x1fea8;\r
15 FX_INT32 CBC_PDF417::STOP_PATTERN = 0x3fa29;\r
16 FX_INT32 CBC_PDF417::CODEWORD_TABLE[][1000] = {\r
17     {\r
18         0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e,\r
19         0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020,\r
20         0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e,\r
21         0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c,\r
22         0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0,\r
23         0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0,\r
24         0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460,\r
25         0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418,\r
26         0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670,\r
27         0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c,\r
28         0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38,\r
29         0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0,\r
30         0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440,\r
31         0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408,\r
32         0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e,\r
33         0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc,\r
34         0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8,\r
35         0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118,\r
36         0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360,\r
37         0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e,\r
38         0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0,\r
39         0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c,\r
40         0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c,\r
41         0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0,\r
42         0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460,\r
43         0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0,\r
44         0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60,\r
45         0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe,\r
46         0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be,\r
47         0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60,\r
48         0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420,\r
49         0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970,\r
50         0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660,\r
51         0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e,\r
52         0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc,\r
53         0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738,\r
54         0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc,\r
55         0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c,\r
56         0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8,\r
57         0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918,\r
58         0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160,\r
59         0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640,\r
60         0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c,\r
61         0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8,\r
62         0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c,\r
63         0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de,\r
64         0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de,\r
65         0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e,\r
66         0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102,\r
67         0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098,\r
68         0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108,\r
69         0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc,\r
70         0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c,\r
71         0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858,\r
72         0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084,\r
73         0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090,\r
74         0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084,\r
75         0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6,\r
76         0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8,\r
77         0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60,\r
78         0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18,\r
79         0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660,\r
80         0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c,\r
81         0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc,\r
82         0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30,\r
83         0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c,\r
84         0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60,\r
85         0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e,\r
86         0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608,\r
87         0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde,\r
88         0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c,\r
89         0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e,\r
90         0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20,\r
91         0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86,\r
92         0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920,\r
93         0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10,\r
94         0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140,\r
95         0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e,\r
96         0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98,\r
97         0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708,\r
98         0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce,\r
99         0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186,\r
100         0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce,\r
101         0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88,\r
102         0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e,\r
103         0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46,\r
104         0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0,\r
105         0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0,\r
106         0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084,\r
107         0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e,\r
108         0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc,\r
109         0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48,\r
110         0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0,\r
111         0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842,\r
112         0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826,\r
113         0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042,\r
114         0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6,\r
115         0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028,\r
116         0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40,\r
117         0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c,\r
118         0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30,\r
119         0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8,\r
120         0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0,\r
121         0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08,\r
122         0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40,\r
123         0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce,\r
124         0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902,\r
125         0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98,\r
126         0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce,\r
127         0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c,\r
128         0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658,\r
129         0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646,\r
130         0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0,\r
131         0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990,\r
132         0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88,\r
133         0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8,\r
134         0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6,\r
135         0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48,\r
136         0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0,\r
137         0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42,\r
138         0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626,\r
139         0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42,\r
140         0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0,\r
141         0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0,\r
142         0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2,\r
143         0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6,\r
144         0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24,\r
145         0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64,\r
146         0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24,\r
147         0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2,\r
148         0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864,\r
149         0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2,\r
150         0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32,\r
151         0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4,\r
152         0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508,\r
153         0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc,\r
154         0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346,\r
155         0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8,\r
156         0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84,\r
157         0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee,\r
158         0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750,\r
159         0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c,\r
160         0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2,\r
161         0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8,\r
162         0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2,\r
163         0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6,\r
164         0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6,\r
165         0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68,\r
166         0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62,\r
167         0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8,\r
168         0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4,\r
169         0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4,\r
170         0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714,\r
171         0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614,\r
172         0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4\r
173     },\r
174     {\r
175         0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20,\r
176         0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506,\r
177         0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30,\r
178         0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c,\r
179         0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de,\r
180         0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e,\r
181         0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60,\r
182         0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20,\r
183         0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06,\r
184         0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18,\r
185         0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e,\r
186         0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e,\r
187         0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902,\r
188         0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce,\r
189         0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302,\r
190         0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce,\r
191         0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702,\r
192         0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce,\r
193         0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0,\r
194         0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc,\r
195         0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c,\r
196         0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8,\r
197         0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184,\r
198         0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc,\r
199         0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8,\r
200         0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784,\r
201         0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee,\r
202         0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842,\r
203         0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2,\r
204         0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2,\r
205         0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2,\r
206         0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822,\r
207         0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076,\r
208         0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2,\r
209         0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072,\r
210         0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e,\r
211         0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502,\r
212         0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce,\r
213         0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02,\r
214         0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce,\r
215         0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702,\r
216         0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce,\r
217         0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0,\r
218         0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc,\r
219         0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c,\r
220         0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682,\r
221         0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e,\r
222         0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84,\r
223         0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0,\r
224         0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88,\r
225         0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8,\r
226         0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc,\r
227         0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782,\r
228         0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc,\r
229         0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84,\r
230         0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc,\r
231         0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8,\r
232         0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642,\r
233         0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8,\r
234         0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c,\r
235         0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4,\r
236         0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8,\r
237         0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2,\r
238         0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8,\r
239         0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec,\r
240         0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624,\r
241         0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636,\r
242         0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8,\r
243         0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876,\r
244         0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8,\r
245         0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2,\r
246         0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414,\r
247         0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832,\r
248         0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4,\r
249         0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a,\r
250         0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158,\r
251         0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284,\r
252         0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc,\r
253         0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8,\r
254         0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84,\r
255         0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc,\r
256         0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee,\r
257         0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8,\r
258         0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342,\r
259         0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8,\r
260         0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c,\r
261         0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4,\r
262         0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8,\r
263         0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2,\r
264         0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8,\r
265         0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec,\r
266         0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4,\r
267         0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328,\r
268         0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e,\r
269         0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116,\r
270         0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4,\r
271         0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464,\r
272         0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2,\r
273         0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4,\r
274         0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6,\r
275         0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4,\r
276         0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8,\r
277         0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e,\r
278         0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634,\r
279         0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74,\r
280         0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4,\r
281         0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4,\r
282         0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c,\r
283         0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a,\r
284         0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa,\r
285         0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac,\r
286         0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c,\r
287         0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec,\r
288         0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec,\r
289         0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6,\r
290         0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2,\r
291         0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122,\r
292         0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4,\r
293         0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4,\r
294         0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8,\r
295         0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6,\r
296         0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e,\r
297         0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2,\r
298         0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772,\r
299         0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2,\r
300         0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2,\r
301         0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2,\r
302         0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e,\r
303         0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e,\r
304         0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a,\r
305         0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a,\r
306         0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa,\r
307         0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be,\r
308         0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2,\r
309         0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176,\r
310         0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2,\r
311         0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4,\r
312         0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372,\r
313         0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4,\r
314         0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca,\r
315         0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a,\r
316         0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa,\r
317         0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe,\r
318         0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c,\r
319         0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8,\r
320         0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c,\r
321         0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172,\r
322         0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a,\r
323         0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e,\r
324         0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede,\r
325         0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86,\r
326         0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e,\r
327         0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26,\r
328         0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c,\r
329         0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26\r
330     },\r
331     {\r
332         0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0,\r
333         0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0,\r
334         0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4,\r
335         0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec,\r
336         0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e,\r
337         0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4,\r
338         0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4,\r
339         0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4,\r
340         0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e,\r
341         0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68,\r
342         0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62,\r
343         0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4,\r
344         0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2,\r
345         0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6,\r
346         0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0,\r
347         0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34,\r
348         0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474,\r
349         0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2,\r
350         0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e,\r
351         0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a,\r
352         0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e,\r
353         0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc,\r
354         0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878,\r
355         0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964,\r
356         0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8,\r
357         0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8,\r
358         0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4,\r
359         0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0,\r
360         0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0,\r
361         0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e,\r
362         0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0,\r
363         0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c,\r
364         0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e,\r
365         0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c,\r
366         0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272,\r
367         0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2,\r
368         0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2,\r
369         0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e,\r
370         0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e,\r
371         0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678,\r
372         0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c,\r
373         0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a,\r
374         0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0,\r
375         0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e,\r
376         0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c,\r
377         0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170,\r
378         0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc,\r
379         0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c,\r
380         0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0,\r
381         0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e,\r
382         0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2,\r
383         0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4,\r
384         0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0,\r
385         0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470,\r
386         0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0,\r
387         0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e,\r
388         0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba,\r
389         0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a,\r
390         0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78,\r
391         0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38,\r
392         0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c,\r
393         0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c,\r
394         0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c,\r
395         0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c,\r
396         0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e,\r
397         0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc,\r
398         0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218,\r
399         0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370,\r
400         0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e,\r
401         0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e,\r
402         0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c,\r
403         0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e,\r
404         0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e,\r
405         0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e,\r
406         0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce,\r
407         0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e,\r
408         0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e,\r
409         0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a,\r
410         0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70,\r
411         0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978,\r
412         0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e,\r
413         0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60,\r
414         0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e,\r
415         0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938,\r
416         0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e,\r
417         0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e,\r
418         0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c,\r
419         0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08,\r
420         0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60,\r
421         0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18,\r
422         0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e,\r
423         0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c,\r
424         0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde,\r
425         0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e,\r
426         0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902,\r
427         0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998,\r
428         0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc,\r
429         0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58,\r
430         0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884,\r
431         0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc,\r
432         0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850,\r
433         0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c,\r
434         0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824,\r
435         0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c,\r
436         0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e,\r
437         0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e,\r
438         0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18,\r
439         0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8,\r
440         0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde,\r
441         0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98,\r
442         0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04,\r
443         0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e,\r
444         0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c,\r
445         0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0,\r
446         0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46,\r
447         0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0,\r
448         0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88,\r
449         0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e,\r
450         0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc,\r
451         0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee,\r
452         0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42,\r
453         0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8,\r
454         0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c,\r
455         0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16,\r
456         0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24,\r
457         0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76,\r
458         0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32,\r
459         0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e,\r
460         0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e,\r
461         0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece,\r
462         0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88,\r
463         0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8,\r
464         0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e,\r
465         0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44,\r
466         0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26,\r
467         0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c,\r
468         0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8,\r
469         0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68,\r
470         0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16,\r
471         0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4,\r
472         0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6,\r
473         0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32,\r
474         0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72,\r
475         0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a,\r
476         0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746,\r
477         0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6,\r
478         0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66,\r
479         0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796,\r
480         0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716,\r
481         0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4,\r
482         0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74,\r
483         0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a,\r
484         0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6,\r
485         0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2,\r
486         0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea\r
487     }\r
488 };\r
489 FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f;\r
490 FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f;\r
491 FX_FLOAT CBC_PDF417::HEIGHT = 2.0f;\r
492 CBC_PDF417::CBC_PDF417()\r
493 {\r
494     m_compact = FALSE;\r
495     m_compaction = AUTO;\r
496     m_minCols = 1;\r
497     m_maxCols = 30;\r
498     m_maxRows = 90;\r
499     m_minRows = 3;\r
500     m_barcodeMatrix = NULL;\r
501 }\r
502 CBC_PDF417::CBC_PDF417(FX_BOOL compact)\r
503 {\r
504     m_compact = compact;\r
505     m_compaction = AUTO;\r
506     m_minCols = 1;\r
507     m_maxCols = 30;\r
508     m_maxRows = 90;\r
509     m_minRows = 3;\r
510     m_barcodeMatrix = NULL;\r
511 }\r
512 CBC_PDF417::~CBC_PDF417()\r
513 {\r
514     if (m_barcodeMatrix) {\r
515         delete m_barcodeMatrix;\r
516     }\r
517 }\r
518 CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix()\r
519 {\r
520     return m_barcodeMatrix;\r
521 }\r
522 void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e)\r
523 {\r
524     FX_INT32 errorCorrectionCodeWords = CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(errorCorrectionLevel, e);\r
525     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
526     CFX_WideString highLevel = CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e);\r
527     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
528     FX_INT32 sourceCodeWords = highLevel.GetLength();\r
529     CFX_Int32Array* dimension = determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e);\r
530     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
531     FX_INT32 cols = dimension->GetAt(0);\r
532     FX_INT32 rows = dimension->GetAt(1);\r
533     delete dimension;\r
534     FX_INT32 pad = getNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows);\r
535     if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) {\r
536         e = BCExceptionEncodedMessageContainsTooManyCodeWords;\r
537         return;\r
538     }\r
539     FX_INT32 n = sourceCodeWords + pad + 1;\r
540     CFX_WideString sb;\r
541     sb += (FX_WCHAR) n;\r
542     sb += highLevel;\r
543     for (FX_INT32 i = 0; i < pad; i++) {\r
544         sb += (FX_WCHAR) 900;\r
545     }\r
546     CFX_WideString dataCodewords(sb);\r
547     CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(dataCodewords, errorCorrectionLevel, e);\r
548     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
549     CFX_WideString fullCodewords = dataCodewords + ec;\r
550     m_barcodeMatrix = FX_NEW CBC_BarcodeMatrix(rows, cols);\r
551     encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel, m_barcodeMatrix);\r
552 }\r
553 void CBC_PDF417::setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows)\r
554 {\r
555     m_maxCols = maxCols;\r
556     m_minCols = minCols;\r
557     m_maxRows = maxRows;\r
558     m_minRows = minRows;\r
559 }\r
560 void CBC_PDF417::setCompaction(Compaction compaction)\r
561 {\r
562     m_compaction = compaction;\r
563 }\r
564 void CBC_PDF417::setCompact(FX_BOOL compact)\r
565 {\r
566     m_compact = compact;\r
567 }\r
568 FX_INT32 CBC_PDF417::calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c)\r
569 {\r
570     FX_INT32 r = ((m + 1 + k) / c) + 1;\r
571     if (c * r >= (m + 1 + k + c)) {\r
572         r--;\r
573     }\r
574     return r;\r
575 }\r
576 FX_INT32 CBC_PDF417::getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r)\r
577 {\r
578     FX_INT32 n = c * r - k;\r
579     return n > m + 1 ? n - m - 1 : 0;\r
580 }\r
581 void CBC_PDF417::encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic)\r
582 {\r
583     FX_INT32 map = 1 << (len - 1);\r
584     FX_BOOL last = ((pattern & map) != 0);\r
585     FX_INT32 width = 0;\r
586     for (FX_INT32 i = 0; i < len; i++) {\r
587         FX_BOOL black = ((pattern & map) != 0);\r
588         if (last == black) {\r
589             width++;\r
590         } else {\r
591             logic->addBar(last, width);\r
592             last = black;\r
593             width = 1;\r
594         }\r
595         map >>= 1;\r
596     }\r
597     logic->addBar(last, width);\r
598 }\r
599 void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic)\r
600 {\r
601     FX_INT32 idx = 0;\r
602     for (FX_INT32 y = 0; y < r; y++) {\r
603         FX_INT32 cluster = y % 3;\r
604         logic->startRow();\r
605         FX_INT32 a = START_PATTERN;\r
606         encodeChar(START_PATTERN, 17, logic->getCurrentRow());\r
607         FX_INT32 left;\r
608         FX_INT32 right;\r
609         if (cluster == 0) {\r
610             left = (30 * (y / 3)) + ((r - 1) / 3);\r
611             right = (30 * (y / 3)) + (c - 1);\r
612         } else if (cluster == 1) {\r
613             left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);\r
614             right = (30 * (y / 3)) + ((r - 1) / 3);\r
615         } else {\r
616             left = (30 * (y / 3)) + (c - 1);\r
617             right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);\r
618         }\r
619         FX_INT32 pattern = CODEWORD_TABLE[cluster][left];\r
620         encodeChar(pattern, 17, logic->getCurrentRow());\r
621         for (FX_INT32 x = 0; x < c; x++) {\r
622             pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)];\r
623             encodeChar(pattern, 17, logic->getCurrentRow());\r
624             idx++;\r
625         }\r
626         if (m_compact) {\r
627             encodeChar(STOP_PATTERN, 1, logic->getCurrentRow());\r
628         } else {\r
629             pattern = CODEWORD_TABLE[cluster][right];\r
630             encodeChar(pattern, 17, logic->getCurrentRow());\r
631             encodeChar(STOP_PATTERN, 18, logic->getCurrentRow());\r
632         }\r
633     }\r
634 }\r
635 CFX_Int32Array* CBC_PDF417::determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e)\r
636 {\r
637     FX_FLOAT ratio = 0.0f;\r
638     CFX_Int32Array* dimension = NULL;\r
639     for (FX_INT32 cols = m_minCols; cols <= m_maxCols; cols++) {\r
640         FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);\r
641         if (rows < m_minRows) {\r
642             break;\r
643         }\r
644         if (rows > m_maxRows) {\r
645             continue;\r
646         }\r
647         FX_FLOAT newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT);\r
648         if (dimension != NULL && fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) {\r
649             continue;\r
650         }\r
651         ratio = newRatio;\r
652         if (dimension) {\r
653             delete dimension;\r
654         }\r
655         dimension = FX_NEW CFX_Int32Array;\r
656         dimension->Add(cols);\r
657         dimension->Add(rows);\r
658     }\r
659     if (dimension == NULL) {\r
660         FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, m_minCols);\r
661         if (rows < m_minRows) {\r
662             dimension = FX_NEW CFX_Int32Array;\r
663             dimension->Add(m_minCols);\r
664             dimension->Add(m_minRows);\r
665         } else if (rows >= 3 && rows <= 90) {\r
666             dimension = FX_NEW CFX_Int32Array;\r
667             dimension->Add(m_minCols);\r
668             dimension->Add(rows);\r
669         }\r
670     }\r
671     if (dimension == NULL) {\r
672         e = BCExceptionUnableToFitMessageInColumns;\r
673         return NULL;\r
674     }\r
675     return dimension;\r
676 }\r