1 #include "studiox_includes.h"
2 extern "C"{
3 #include "gx_utility.h"
4 }
5 
6 static GX_CANONICAL_COMBINING_CLASS gx_studio_canonical_combining_class_table[] = {
7     { 0x0300, 230 },
8     { 0x0301, 230 },
9     { 0x0302, 230 },
10     { 0x0303, 230 },
11     { 0x0304, 230 },
12     { 0x0305, 230 },
13     { 0x0306, 230 },
14     { 0x0307, 230 },
15     { 0x0308, 230 },
16     { 0x0309, 230 },
17     { 0x030A, 230 },
18     { 0x030B, 230 },
19     { 0x030C, 230 },
20     { 0x030D, 230 },
21     { 0x030E, 230 },
22     { 0x030F, 230 },
23     { 0x0310, 230 },
24     { 0x0311, 230 },
25     { 0x0312, 230 },
26     { 0x0313, 230 },
27     { 0x0314, 230 },
28     { 0x0315, 232 },
29     { 0x0316, 220 },
30     { 0x0317, 220 },
31     { 0x0318, 220 },
32     { 0x0319, 220 },
33     { 0x031A, 232 },
34     { 0x031B, 216 },
35     { 0x031C, 220 },
36     { 0x031D, 220 },
37     { 0x031E, 220 },
38     { 0x031F, 220 },
39     { 0x0320, 220 },
40     { 0x0321, 202 },
41     { 0x0322, 202 },
42     { 0x0323, 220 },
43     { 0x0324, 220 },
44     { 0x0325, 220 },
45     { 0x0326, 220 },
46     { 0x0327, 202 },
47     { 0x0328, 202 },
48     { 0x0329, 220 },
49     { 0x032A, 220 },
50     { 0x032B, 220 },
51     { 0x032C, 220 },
52     { 0x032D, 220 },
53     { 0x032E, 220 },
54     { 0x032F, 220 },
55     { 0x0330, 220 },
56     { 0x0331, 220 },
57     { 0x0332, 220 },
58     { 0x0333, 220 },
59     { 0x0334, 1 },
60     { 0x0335, 1 },
61     { 0x0336, 1 },
62     { 0x0337, 1 },
63     { 0x0338, 1 },
64     { 0x0339, 220 },
65     { 0x033A, 220 },
66     { 0x033B, 220 },
67     { 0x033C, 220 },
68     { 0x033D, 230 },
69     { 0x033E, 230 },
70     { 0x033F, 230 },
71     { 0x0340, 230 },
72     { 0x0341, 230 },
73     { 0x0342, 230 },
74     { 0x0343, 230 },
75     { 0x0344, 230 },
76     { 0x0345, 240 },
77     { 0x0346, 230 },
78     { 0x0347, 220 },
79     { 0x0348, 220 },
80     { 0x0349, 220 },
81     { 0x034A, 230 },
82     { 0x034B, 230 },
83     { 0x034C, 230 },
84     { 0x034D, 220 },
85     { 0x034E, 220 },
86     { 0x0350, 230 },
87     { 0x0351, 230 },
88     { 0x0352, 230 },
89     { 0x0353, 220 },
90     { 0x0354, 220 },
91     { 0x0355, 220 },
92     { 0x0356, 220 },
93     { 0x0357, 230 },
94     { 0x0358, 232 },
95     { 0x0359, 220 },
96     { 0x035A, 220 },
97     { 0x035B, 230 },
98     { 0x035C, 233 },
99     { 0x035D, 234 },
100     { 0x035E, 234 },
101     { 0x035F, 233 },
102     { 0x0360, 234 },
103     { 0x0361, 234 },
104     { 0x0362, 233 },
105     { 0x0363, 230 },
106     { 0x0364, 230 },
107     { 0x0365, 230 },
108     { 0x0366, 230 },
109     { 0x0367, 230 },
110     { 0x0368, 230 },
111     { 0x0369, 230 },
112     { 0x036A, 230 },
113     { 0x036B, 230 },
114     { 0x036C, 230 },
115     { 0x036D, 230 },
116     { 0x036E, 230 },
117     { 0x036F, 230 },
118     { 0x0483, 230 },
119     { 0x0484, 230 },
120     { 0x0485, 230 },
121     { 0x0486, 230 },
122     { 0x0487, 230 },
123     { 0x0591, 220 },
124     { 0x0592, 230 },
125     { 0x0593, 230 },
126     { 0x0594, 230 },
127     { 0x0595, 230 },
128     { 0x0596, 220 },
129     { 0x0597, 230 },
130     { 0x0598, 230 },
131     { 0x0599, 230 },
132     { 0x059A, 222 },
133     { 0x059B, 220 },
134     { 0x059C, 230 },
135     { 0x059D, 230 },
136     { 0x059E, 230 },
137     { 0x059F, 230 },
138     { 0x05A0, 230 },
139     { 0x05A1, 230 },
140     { 0x05A2, 220 },
141     { 0x05A3, 220 },
142     { 0x05A4, 220 },
143     { 0x05A5, 220 },
144     { 0x05A6, 220 },
145     { 0x05A7, 220 },
146     { 0x05A8, 230 },
147     { 0x05A9, 230 },
148     { 0x05AA, 220 },
149     { 0x05AB, 230 },
150     { 0x05AC, 230 },
151     { 0x05AD, 222 },
152     { 0x05AE, 228 },
153     { 0x05AF, 230 },
154     { 0x05B0, 10 },
155     { 0x05B1, 11 },
156     { 0x05B2, 12 },
157     { 0x05B3, 13 },
158     { 0x05B4, 14 },
159     { 0x05B5, 15 },
160     { 0x05B6, 16 },
161     { 0x05B7, 17 },
162     { 0x05B8, 18 },
163     { 0x05B9, 19 },
164     { 0x05BA, 19 },
165     { 0x05BB, 20 },
166     { 0x05BC, 21 },
167     { 0x05BD, 22 },
168     { 0x05BF, 23 },
169     { 0x05C1, 24 },
170     { 0x05C2, 25 },
171     { 0x05C4, 230 },
172     { 0x05C5, 220 },
173     { 0x05C7, 18 },
174     { 0x0610, 230 },
175     { 0x0611, 230 },
176     { 0x0612, 230 },
177     { 0x0613, 230 },
178     { 0x0614, 230 },
179     { 0x0615, 230 },
180     { 0x0616, 230 },
181     { 0x0617, 230 },
182     { 0x0618, 30 },
183     { 0x0619, 31 },
184     { 0x061A, 32 },
185     { 0x064B, 27 },
186     { 0x064C, 28 },
187     { 0x064D, 29 },
188     { 0x064E, 30 },
189     { 0x064F, 31 },
190     { 0x0650, 32 },
191     { 0x0651, 33 },
192     { 0x0652, 34 },
193     { 0x0653, 230 },
194     { 0x0654, 230 },
195     { 0x0655, 220 },
196     { 0x0656, 220 },
197     { 0x0657, 230 },
198     { 0x0658, 230 },
199     { 0x0659, 230 },
200     { 0x065A, 230 },
201     { 0x065B, 230 },
202     { 0x065C, 220 },
203     { 0x065D, 230 },
204     { 0x065E, 230 },
205     { 0x065F, 220 },
206     { 0x0670, 35 },
207     { 0x06D6, 230 },
208     { 0x06D7, 230 },
209     { 0x06D8, 230 },
210     { 0x06D9, 230 },
211     { 0x06DA, 230 },
212     { 0x06DB, 230 },
213     { 0x06DC, 230 },
214     { 0x06DF, 230 },
215     { 0x06E0, 230 },
216     { 0x06E1, 230 },
217     { 0x06E2, 230 },
218     { 0x06E3, 220 },
219     { 0x06E4, 230 },
220     { 0x06E7, 230 },
221     { 0x06E8, 230 },
222     { 0x06EA, 220 },
223     { 0x06EB, 230 },
224     { 0x06EC, 230 },
225     { 0x06ED, 220 },
226     { 0x0711, 36 },
227     { 0x0730, 230 },
228     { 0x0731, 220 },
229     { 0x0732, 230 },
230     { 0x0733, 230 },
231     { 0x0734, 220 },
232     { 0x0735, 230 },
233     { 0x0736, 230 },
234     { 0x0737, 220 },
235     { 0x0738, 220 },
236     { 0x0739, 220 },
237     { 0x073A, 230 },
238     { 0x073B, 220 },
239     { 0x073C, 220 },
240     { 0x073D, 230 },
241     { 0x073E, 220 },
242     { 0x073F, 230 },
243     { 0x0740, 230 },
244     { 0x0741, 230 },
245     { 0x0742, 220 },
246     { 0x0743, 230 },
247     { 0x0744, 220 },
248     { 0x0745, 230 },
249     { 0x0746, 220 },
250     { 0x0747, 230 },
251     { 0x0748, 220 },
252     { 0x0749, 230 },
253     { 0x074A, 230 },
254     { 0x07EB, 230 },
255     { 0x07EC, 230 },
256     { 0x07ED, 230 },
257     { 0x07EE, 230 },
258     { 0x07EF, 230 },
259     { 0x07F0, 230 },
260     { 0x07F1, 230 },
261     { 0x07F2, 220 },
262     { 0x07F3, 230 },
263     { 0x07FD, 220 },
264     { 0x0816, 230 },
265     { 0x0817, 230 },
266     { 0x0818, 230 },
267     { 0x0819, 230 },
268     { 0x081B, 230 },
269     { 0x081C, 230 },
270     { 0x081D, 230 },
271     { 0x081E, 230 },
272     { 0x081F, 230 },
273     { 0x0820, 230 },
274     { 0x0821, 230 },
275     { 0x0822, 230 },
276     { 0x0823, 230 },
277     { 0x0825, 230 },
278     { 0x0826, 230 },
279     { 0x0827, 230 },
280     { 0x0829, 230 },
281     { 0x082A, 230 },
282     { 0x082B, 230 },
283     { 0x082C, 230 },
284     { 0x082D, 230 },
285     { 0x0859, 220 },
286     { 0x085A, 220 },
287     { 0x085B, 220 },
288     { 0x08D3, 220 },
289     { 0x08D4, 230 },
290     { 0x08D5, 230 },
291     { 0x08D6, 230 },
292     { 0x08D7, 230 },
293     { 0x08D8, 230 },
294     { 0x08D9, 230 },
295     { 0x08DA, 230 },
296     { 0x08DB, 230 },
297     { 0x08DC, 230 },
298     { 0x08DD, 230 },
299     { 0x08DE, 230 },
300     { 0x08DF, 230 },
301     { 0x08E0, 230 },
302     { 0x08E1, 230 },
303     { 0x08E3, 220 },
304     { 0x08E4, 230 },
305     { 0x08E5, 230 },
306     { 0x08E6, 220 },
307     { 0x08E7, 230 },
308     { 0x08E8, 230 },
309     { 0x08E9, 220 },
310     { 0x08EA, 230 },
311     { 0x08EB, 230 },
312     { 0x08EC, 230 },
313     { 0x08ED, 220 },
314     { 0x08EE, 220 },
315     { 0x08EF, 220 },
316     { 0x08F0, 27 },
317     { 0x08F1, 28 },
318     { 0x08F2, 29 },
319     { 0x08F3, 230 },
320     { 0x08F4, 230 },
321     { 0x08F5, 230 },
322     { 0x08F6, 220 },
323     { 0x08F7, 230 },
324     { 0x08F8, 230 },
325     { 0x08F9, 220 },
326     { 0x08FA, 220 },
327     { 0x08FB, 230 },
328     { 0x08FC, 230 },
329     { 0x08FD, 230 },
330     { 0x08FE, 230 },
331     { 0x08FF, 230 },
332     { 0x093C, 7 },
333     { 0x094D, 9 },
334     { 0x0951, 230 },
335     { 0x0952, 220 },
336     { 0x0953, 230 },
337     { 0x0954, 230 },
338     { 0x09BC, 7 },
339     { 0x09CD, 9 },
340     { 0x09FE, 230 },
341     { 0x0A3C, 7 },
342     { 0x0A4D, 9 },
343     { 0x0ABC, 7 },
344     { 0x0ACD, 9 },
345     { 0x0B3C, 7 },
346     { 0x0B4D, 9 },
347     { 0x0BCD, 9 },
348     { 0x0C4D, 9 },
349     { 0x0C55, 84 },
350     { 0x0C56, 91 },
351     { 0x0CBC, 7 },
352     { 0x0CCD, 9 },
353     { 0x0D3B, 9 },
354     { 0x0D3C, 9 },
355     { 0x0D4D, 9 },
356     { 0x0DCA, 9 },
357     { 0x0E38, 103 },
358     { 0x0E39, 103 },
359     { 0x0E3A, 9 },
360     { 0x0E48, 107 },
361     { 0x0E49, 107 },
362     { 0x0E4A, 107 },
363     { 0x0E4B, 107 },
364     { 0x0EB8, 118 },
365     { 0x0EB9, 118 },
366     { 0x0EC8, 122 },
367     { 0x0EC9, 122 },
368     { 0x0ECA, 122 },
369     { 0x0ECB, 122 },
370     { 0x0F18, 220 },
371     { 0x0F19, 220 },
372     { 0x0F35, 220 },
373     { 0x0F37, 220 },
374     { 0x0F39, 216 },
375     { 0x0F71, 129 },
376     { 0x0F72, 130 },
377     { 0x0F74, 132 },
378     { 0x0F7A, 130 },
379     { 0x0F7B, 130 },
380     { 0x0F7C, 130 },
381     { 0x0F7D, 130 },
382     { 0x0F80, 130 },
383     { 0x0F82, 230 },
384     { 0x0F83, 230 },
385     { 0x0F84, 9 },
386     { 0x0F86, 230 },
387     { 0x0F87, 230 },
388     { 0x0FC6, 220 },
389     { 0x1037, 7 },
390     { 0x1039, 9 },
391     { 0x103A, 9 },
392     { 0x108D, 220 },
393     { 0x135D, 230 },
394     { 0x135E, 230 },
395     { 0x135F, 230 },
396     { 0x1714, 9 },
397     { 0x1734, 9 },
398     { 0x17D2, 9 },
399     { 0x17DD, 230 },
400     { 0x18A9, 228 },
401     { 0x1939, 222 },
402     { 0x193A, 230 },
403     { 0x193B, 220 },
404     { 0x1A17, 230 },
405     { 0x1A18, 220 },
406     { 0x1A60, 9 },
407     { 0x1A75, 230 },
408     { 0x1A76, 230 },
409     { 0x1A77, 230 },
410     { 0x1A78, 230 },
411     { 0x1A79, 230 },
412     { 0x1A7A, 230 },
413     { 0x1A7B, 230 },
414     { 0x1A7C, 230 },
415     { 0x1A7F, 220 },
416     { 0x1AB0, 230 },
417     { 0x1AB1, 230 },
418     { 0x1AB2, 230 },
419     { 0x1AB3, 230 },
420     { 0x1AB4, 230 },
421     { 0x1AB5, 220 },
422     { 0x1AB6, 220 },
423     { 0x1AB7, 220 },
424     { 0x1AB8, 220 },
425     { 0x1AB9, 220 },
426     { 0x1ABA, 220 },
427     { 0x1ABB, 230 },
428     { 0x1ABC, 230 },
429     { 0x1ABD, 220 },
430     { 0x1B34, 7 },
431     { 0x1B44, 9 },
432     { 0x1B6B, 230 },
433     { 0x1B6C, 220 },
434     { 0x1B6D, 230 },
435     { 0x1B6E, 230 },
436     { 0x1B6F, 230 },
437     { 0x1B70, 230 },
438     { 0x1B71, 230 },
439     { 0x1B72, 230 },
440     { 0x1B73, 230 },
441     { 0x1BAA, 9 },
442     { 0x1BAB, 9 },
443     { 0x1BE6, 7 },
444     { 0x1BF2, 9 },
445     { 0x1BF3, 9 },
446     { 0x1C37, 7 },
447     { 0x1CD0, 230 },
448     { 0x1CD1, 230 },
449     { 0x1CD2, 230 },
450     { 0x1CD4, 1 },
451     { 0x1CD5, 220 },
452     { 0x1CD6, 220 },
453     { 0x1CD7, 220 },
454     { 0x1CD8, 220 },
455     { 0x1CD9, 220 },
456     { 0x1CDA, 230 },
457     { 0x1CDB, 230 },
458     { 0x1CDC, 220 },
459     { 0x1CDD, 220 },
460     { 0x1CDE, 220 },
461     { 0x1CDF, 220 },
462     { 0x1CE0, 230 },
463     { 0x1CE2, 1 },
464     { 0x1CE3, 1 },
465     { 0x1CE4, 1 },
466     { 0x1CE5, 1 },
467     { 0x1CE6, 1 },
468     { 0x1CE7, 1 },
469     { 0x1CE8, 1 },
470     { 0x1CED, 220 },
471     { 0x1CF4, 230 },
472     { 0x1CF8, 230 },
473     { 0x1CF9, 230 },
474     { 0x1DC0, 230 },
475     { 0x1DC1, 230 },
476     { 0x1DC2, 220 },
477     { 0x1DC3, 230 },
478     { 0x1DC4, 230 },
479     { 0x1DC5, 230 },
480     { 0x1DC6, 230 },
481     { 0x1DC7, 230 },
482     { 0x1DC8, 230 },
483     { 0x1DC9, 230 },
484     { 0x1DCA, 220 },
485     { 0x1DCB, 230 },
486     { 0x1DCC, 230 },
487     { 0x1DCD, 234 },
488     { 0x1DCE, 214 },
489     { 0x1DCF, 220 },
490     { 0x1DD0, 202 },
491     { 0x1DD1, 230 },
492     { 0x1DD2, 230 },
493     { 0x1DD3, 230 },
494     { 0x1DD4, 230 },
495     { 0x1DD5, 230 },
496     { 0x1DD6, 230 },
497     { 0x1DD7, 230 },
498     { 0x1DD8, 230 },
499     { 0x1DD9, 230 },
500     { 0x1DDA, 230 },
501     { 0x1DDB, 230 },
502     { 0x1DDC, 230 },
503     { 0x1DDD, 230 },
504     { 0x1DDE, 230 },
505     { 0x1DDF, 230 },
506     { 0x1DE0, 230 },
507     { 0x1DE1, 230 },
508     { 0x1DE2, 230 },
509     { 0x1DE3, 230 },
510     { 0x1DE4, 230 },
511     { 0x1DE5, 230 },
512     { 0x1DE6, 230 },
513     { 0x1DE7, 230 },
514     { 0x1DE8, 230 },
515     { 0x1DE9, 230 },
516     { 0x1DEA, 230 },
517     { 0x1DEB, 230 },
518     { 0x1DEC, 230 },
519     { 0x1DED, 230 },
520     { 0x1DEE, 230 },
521     { 0x1DEF, 230 },
522     { 0x1DF0, 230 },
523     { 0x1DF1, 230 },
524     { 0x1DF2, 230 },
525     { 0x1DF3, 230 },
526     { 0x1DF4, 230 },
527     { 0x1DF5, 230 },
528     { 0x1DF6, 232 },
529     { 0x1DF7, 228 },
530     { 0x1DF8, 228 },
531     { 0x1DF9, 220 },
532     { 0x1DFB, 230 },
533     { 0x1DFC, 233 },
534     { 0x1DFD, 220 },
535     { 0x1DFE, 230 },
536     { 0x1DFF, 220 },
537     { 0x20D0, 230 },
538     { 0x20D1, 230 },
539     { 0x20D2, 1 },
540     { 0x20D3, 1 },
541     { 0x20D4, 230 },
542     { 0x20D5, 230 },
543     { 0x20D6, 230 },
544     { 0x20D7, 230 },
545     { 0x20D8, 1 },
546     { 0x20D9, 1 },
547     { 0x20DA, 1 },
548     { 0x20DB, 230 },
549     { 0x20DC, 230 },
550     { 0x20E1, 230 },
551     { 0x20E5, 1 },
552     { 0x20E6, 1 },
553     { 0x20E7, 230 },
554     { 0x20E8, 220 },
555     { 0x20E9, 230 },
556     { 0x20EA, 1 },
557     { 0x20EB, 1 },
558     { 0x20EC, 220 },
559     { 0x20ED, 220 },
560     { 0x20EE, 220 },
561     { 0x20EF, 220 },
562     { 0x20F0, 230 },
563     { 0x2CEF, 230 },
564     { 0x2CF0, 230 },
565     { 0x2CF1, 230 },
566     { 0x2D7F, 9 },
567     { 0x2DE0, 230 },
568     { 0x2DE1, 230 },
569     { 0x2DE2, 230 },
570     { 0x2DE3, 230 },
571     { 0x2DE4, 230 },
572     { 0x2DE5, 230 },
573     { 0x2DE6, 230 },
574     { 0x2DE7, 230 },
575     { 0x2DE8, 230 },
576     { 0x2DE9, 230 },
577     { 0x2DEA, 230 },
578     { 0x2DEB, 230 },
579     { 0x2DEC, 230 },
580     { 0x2DED, 230 },
581     { 0x2DEE, 230 },
582     { 0x2DEF, 230 },
583     { 0x2DF0, 230 },
584     { 0x2DF1, 230 },
585     { 0x2DF2, 230 },
586     { 0x2DF3, 230 },
587     { 0x2DF4, 230 },
588     { 0x2DF5, 230 },
589     { 0x2DF6, 230 },
590     { 0x2DF7, 230 },
591     { 0x2DF8, 230 },
592     { 0x2DF9, 230 },
593     { 0x2DFA, 230 },
594     { 0x2DFB, 230 },
595     { 0x2DFC, 230 },
596     { 0x2DFD, 230 },
597     { 0x2DFE, 230 },
598     { 0x2DFF, 230 },
599     { 0x302A, 218 },
600     { 0x302B, 228 },
601     { 0x302C, 232 },
602     { 0x302D, 222 },
603     { 0x302E, 224 },
604     { 0x302F, 224 },
605     { 0x3099, 8 },
606     { 0x309A, 8 },
607     { 0xA66F, 230 },
608     { 0xA674, 230 },
609     { 0xA675, 230 },
610     { 0xA676, 230 },
611     { 0xA677, 230 },
612     { 0xA678, 230 },
613     { 0xA679, 230 },
614     { 0xA67A, 230 },
615     { 0xA67B, 230 },
616     { 0xA67C, 230 },
617     { 0xA67D, 230 },
618     { 0xA69E, 230 },
619     { 0xA69F, 230 },
620     { 0xA6F0, 230 },
621     { 0xA6F1, 230 },
622     { 0xA806, 9 },
623     { 0xA8C4, 9 },
624     { 0xA8E0, 230 },
625     { 0xA8E1, 230 },
626     { 0xA8E2, 230 },
627     { 0xA8E3, 230 },
628     { 0xA8E4, 230 },
629     { 0xA8E5, 230 },
630     { 0xA8E6, 230 },
631     { 0xA8E7, 230 },
632     { 0xA8E8, 230 },
633     { 0xA8E9, 230 },
634     { 0xA8EA, 230 },
635     { 0xA8EB, 230 },
636     { 0xA8EC, 230 },
637     { 0xA8ED, 230 },
638     { 0xA8EE, 230 },
639     { 0xA8EF, 230 },
640     { 0xA8F0, 230 },
641     { 0xA8F1, 230 },
642     { 0xA92B, 220 },
643     { 0xA92C, 220 },
644     { 0xA92D, 220 },
645     { 0xA953, 9 },
646     { 0xA9B3, 7 },
647     { 0xA9C0, 9 },
648     { 0xAAB0, 230 },
649     { 0xAAB2, 230 },
650     { 0xAAB3, 230 },
651     { 0xAAB4, 220 },
652     { 0xAAB7, 230 },
653     { 0xAAB8, 230 },
654     { 0xAABE, 230 },
655     { 0xAABF, 230 },
656     { 0xAAC1, 230 },
657     { 0xAAF6, 9 },
658     { 0xABED, 9 },
659     { 0xFB1E, 26 },
660     { 0xFE20, 230 },
661     { 0xFE21, 230 },
662     { 0xFE22, 230 },
663     { 0xFE23, 230 },
664     { 0xFE24, 230 },
665     { 0xFE25, 230 },
666     { 0xFE26, 230 },
667     { 0xFE27, 220 },
668     { 0xFE28, 220 },
669     { 0xFE29, 220 },
670     { 0xFE2A, 220 },
671     { 0xFE2B, 220 },
672     { 0xFE2C, 220 },
673     { 0xFE2D, 220 },
674     { 0xFE2E, 230 },
675     { 0xFE2F, 230 },
676     { 0x101FD, 220 },
677     { 0x102E0, 220 },
678     { 0x10376, 230 },
679     { 0x10377, 230 },
680     { 0x10378, 230 },
681     { 0x10379, 230 },
682     { 0x1037A, 230 },
683     { 0x10A0D, 220 },
684     { 0x10A0F, 230 },
685     { 0x10A38, 230 },
686     { 0x10A39, 1 },
687     { 0x10A3A, 220 },
688     { 0x10A3F, 9 },
689     { 0x10AE5, 230 },
690     { 0x10AE6, 220 },
691     { 0x10D24, 230 },
692     { 0x10D25, 230 },
693     { 0x10D26, 230 },
694     { 0x10D27, 230 },
695     { 0x10F46, 220 },
696     { 0x10F47, 220 },
697     { 0x10F48, 230 },
698     { 0x10F49, 230 },
699     { 0x10F4A, 230 },
700     { 0x10F4B, 220 },
701     { 0x10F4C, 230 },
702     { 0x10F4D, 220 },
703     { 0x10F4E, 220 },
704     { 0x10F4F, 220 },
705     { 0x10F50, 220 },
706     { 0x11046, 9 },
707     { 0x1107F, 9 },
708     { 0x110B9, 9 },
709     { 0x110BA, 7 },
710     { 0x11100, 230 },
711     { 0x11101, 230 },
712     { 0x11102, 230 },
713     { 0x11133, 9 },
714     { 0x11134, 9 },
715     { 0x11173, 7 },
716     { 0x111C0, 9 },
717     { 0x111CA, 7 },
718     { 0x11235, 9 },
719     { 0x11236, 7 },
720     { 0x112E9, 7 },
721     { 0x112EA, 9 },
722     { 0x1133B, 7 },
723     { 0x1133C, 7 },
724     { 0x1134D, 9 },
725     { 0x11366, 230 },
726     { 0x11367, 230 },
727     { 0x11368, 230 },
728     { 0x11369, 230 },
729     { 0x1136A, 230 },
730     { 0x1136B, 230 },
731     { 0x1136C, 230 },
732     { 0x11370, 230 },
733     { 0x11371, 230 },
734     { 0x11372, 230 },
735     { 0x11373, 230 },
736     { 0x11374, 230 },
737     { 0x11442, 9 },
738     { 0x11446, 7 },
739     { 0x1145E, 230 },
740     { 0x114C2, 9 },
741     { 0x114C3, 7 },
742     { 0x115BF, 9 },
743     { 0x115C0, 7 },
744     { 0x1163F, 9 },
745     { 0x116B6, 9 },
746     { 0x116B7, 7 },
747     { 0x1172B, 9 },
748     { 0x11839, 9 },
749     { 0x1183A, 7 },
750     { 0x11A34, 9 },
751     { 0x11A47, 9 },
752     { 0x11A99, 9 },
753     { 0x11C3F, 9 },
754     { 0x11D42, 7 },
755     { 0x11D44, 9 },
756     { 0x11D45, 9 },
757     { 0x11D97, 9 },
758     { 0x16AF0, 1 },
759     { 0x16AF1, 1 },
760     { 0x16AF2, 1 },
761     { 0x16AF3, 1 },
762     { 0x16AF4, 1 },
763     { 0x16B30, 230 },
764     { 0x16B31, 230 },
765     { 0x16B32, 230 },
766     { 0x16B33, 230 },
767     { 0x16B34, 230 },
768     { 0x16B35, 230 },
769     { 0x16B36, 230 },
770     { 0x1BC9E, 1 },
771     { 0x1D165, 216 },
772     { 0x1D166, 216 },
773     { 0x1D167, 1 },
774     { 0x1D168, 1 },
775     { 0x1D169, 1 },
776     { 0x1D16D, 226 },
777     { 0x1D16E, 216 },
778     { 0x1D16F, 216 },
779     { 0x1D170, 216 },
780     { 0x1D171, 216 },
781     { 0x1D172, 216 },
782     { 0x1D17B, 220 },
783     { 0x1D17C, 220 },
784     { 0x1D17D, 220 },
785     { 0x1D17E, 220 },
786     { 0x1D17F, 220 },
787     { 0x1D180, 220 },
788     { 0x1D181, 220 },
789     { 0x1D182, 220 },
790     { 0x1D185, 230 },
791     { 0x1D186, 230 },
792     { 0x1D187, 230 },
793     { 0x1D188, 230 },
794     { 0x1D189, 230 },
795     { 0x1D18A, 220 },
796     { 0x1D18B, 220 },
797     { 0x1D1AA, 230 },
798     { 0x1D1AB, 230 },
799     { 0x1D1AC, 230 },
800     { 0x1D1AD, 230 },
801     { 0x1D242, 230 },
802     { 0x1D243, 230 },
803     { 0x1D244, 230 },
804     { 0x1E000, 230 },
805     { 0x1E001, 230 },
806     { 0x1E002, 230 },
807     { 0x1E003, 230 },
808     { 0x1E004, 230 },
809     { 0x1E005, 230 },
810     { 0x1E006, 230 },
811     { 0x1E008, 230 },
812     { 0x1E009, 230 },
813     { 0x1E00A, 230 },
814     { 0x1E00B, 230 },
815     { 0x1E00C, 230 },
816     { 0x1E00D, 230 },
817     { 0x1E00E, 230 },
818     { 0x1E00F, 230 },
819     { 0x1E010, 230 },
820     { 0x1E011, 230 },
821     { 0x1E012, 230 },
822     { 0x1E013, 230 },
823     { 0x1E014, 230 },
824     { 0x1E015, 230 },
825     { 0x1E016, 230 },
826     { 0x1E017, 230 },
827     { 0x1E018, 230 },
828     { 0x1E01B, 230 },
829     { 0x1E01C, 230 },
830     { 0x1E01D, 230 },
831     { 0x1E01E, 230 },
832     { 0x1E01F, 230 },
833     { 0x1E020, 230 },
834     { 0x1E021, 230 },
835     { 0x1E023, 230 },
836     { 0x1E024, 230 },
837     { 0x1E026, 230 },
838     { 0x1E027, 230 },
839     { 0x1E028, 230 },
840     { 0x1E029, 230 },
841     { 0x1E02A, 230 },
842     { 0x1E8D0, 220 },
843     { 0x1E8D1, 220 },
844     { 0x1E8D2, 220 },
845     { 0x1E8D3, 220 },
846     { 0x1E8D4, 220 },
847     { 0x1E8D5, 220 },
848     { 0x1E8D6, 220 },
849     { 0x1E944, 230 },
850     { 0x1E945, 230 },
851     { 0x1E946, 230 },
852     { 0x1E947, 230 },
853     { 0x1E948, 230 },
854     { 0x1E949, 230 },
855     { 0x1E94A, 7 },
856     { 0, 0 }
857 };
858 
859 static GX_CANONICAL_DECOMPOSE_MAP gx_studio_canonical_decompose_maps[] = {
860     {0x00C0, {0x0041, 0x0300}},
861     {0x00C1, {0x0041, 0x0301}},
862     {0x00C2, {0x0041, 0x0302}},
863     {0x00C3, {0x0041, 0x0303}},
864     {0x00C4, {0x0041, 0x0308}},
865     {0x00C5, {0x0041, 0x030A}},
866     {0x00C7, {0x0043, 0x0327}},
867     {0x00C8, {0x0045, 0x0300}},
868     {0x00C9, {0x0045, 0x0301}},
869     {0x00CA, {0x0045, 0x0302}},
870     {0x00CB, {0x0045, 0x0308}},
871     {0x00CC, {0x0049, 0x0300}},
872     {0x00CD, {0x0049, 0x0301}},
873     {0x00CE, {0x0049, 0x0302}},
874     {0x00CF, {0x0049, 0x0308}},
875     {0x00D1, {0x004E, 0x0303}},
876     {0x00D2, {0x004F, 0x0300}},
877     {0x00D3, {0x004F, 0x0301}},
878     {0x00D4, {0x004F, 0x0302}},
879     {0x00D5, {0x004F, 0x0303}},
880     { 0x00D6, { 0x004F, 0x0308 } },
881     { 0x00D9, { 0x0055, 0x0300 } },
882     { 0x00DA, { 0x0055, 0x0301 } },
883     { 0x00DB, { 0x0055, 0x0302 } },
884     { 0x00DC, { 0x0055, 0x0308 } },
885     { 0x00DD, { 0x0059, 0x0301 } },
886     { 0x00E0, { 0x0061, 0x0300 } },
887     { 0x00E1, { 0x0061, 0x0301 } },
888     { 0x00E2, { 0x0061, 0x0302 } },
889     { 0x00E3, { 0x0061, 0x0303 } },
890     { 0x00E4, { 0x0061, 0x0308 } },
891     { 0x00E5, { 0x0061, 0x030A } },
892     { 0x00E7, { 0x0063, 0x0327 } },
893     { 0x00E8, { 0x0065, 0x0300 } },
894     { 0x00E9, { 0x0065, 0x0301 } },
895     { 0x00EA, { 0x0065, 0x0302 } },
896     { 0x00EB, { 0x0065, 0x0308 } },
897     { 0x00EC, { 0x0069, 0x0300 } },
898     { 0x00ED, { 0x0069, 0x0301 } },
899     { 0x00EE, { 0x0069, 0x0302 } },
900     { 0x00EF, { 0x0069, 0x0308 } },
901     { 0x00F1, { 0x006E, 0x0303 } },
902     { 0x00F2, { 0x006F, 0x0300 } },
903     { 0x00F3, { 0x006F, 0x0301 } },
904     { 0x00F4, { 0x006F, 0x0302 } },
905     { 0x00F5, { 0x006F, 0x0303 } },
906     { 0x00F6, { 0x006F, 0x0308 } },
907     { 0x00F9, { 0x0075, 0x0300 } },
908     { 0x00FA, { 0x0075, 0x0301 } },
909     { 0x00FB, { 0x0075, 0x0302 } },
910     { 0x00FC, { 0x0075, 0x0308 } },
911     { 0x00FD, { 0x0079, 0x0301 } },
912     { 0x00FF, { 0x0079, 0x0308 } },
913     { 0x0100, { 0x0041, 0x0304 } },
914     { 0x0101, { 0x0061, 0x0304 } },
915     { 0x0102, { 0x0041, 0x0306 } },
916     { 0x0103, { 0x0061, 0x0306 } },
917     { 0x0104, { 0x0041, 0x0328 } },
918     { 0x0105, { 0x0061, 0x0328 } },
919     { 0x0106, { 0x0043, 0x0301 } },
920     { 0x0107, { 0x0063, 0x0301 } },
921     { 0x0108, { 0x0043, 0x0302 } },
922     { 0x0109, { 0x0063, 0x0302 } },
923     { 0x010A, { 0x0043, 0x0307 } },
924     { 0x010B, { 0x0063, 0x0307 } },
925     { 0x010C, { 0x0043, 0x030C } },
926     { 0x010D, { 0x0063, 0x030C } },
927     { 0x010E, { 0x0044, 0x030C } },
928     { 0x010F, { 0x0064, 0x030C } },
929     { 0x0112, { 0x0045, 0x0304 } },
930     { 0x0113, { 0x0065, 0x0304 } },
931     { 0x0114, { 0x0045, 0x0306 } },
932     { 0x0115, { 0x0065, 0x0306 } },
933     { 0x0116, { 0x0045, 0x0307 } },
934     { 0x0117, { 0x0065, 0x0307 } },
935     { 0x0118, { 0x0045, 0x0328 } },
936     { 0x0119, { 0x0065, 0x0328 } },
937     { 0x011A, { 0x0045, 0x030C } },
938     { 0x011B, { 0x0065, 0x030C } },
939     { 0x011C, { 0x0047, 0x0302 } },
940     { 0x011D, { 0x0067, 0x0302 } },
941     { 0x011E, { 0x0047, 0x0306 } },
942     { 0x011F, { 0x0067, 0x0306 } },
943     { 0x0120, { 0x0047, 0x0307 } },
944     { 0x0121, { 0x0067, 0x0307 } },
945     { 0x0122, { 0x0047, 0x0327 } },
946     { 0x0123, { 0x0067, 0x0327 } },
947     { 0x0124, { 0x0048, 0x0302 } },
948     { 0x0125, { 0x0068, 0x0302 } },
949     { 0x0128, { 0x0049, 0x0303 } },
950     { 0x0129, { 0x0069, 0x0303 } },
951     { 0x012A, { 0x0049, 0x0304 } },
952     { 0x012B, { 0x0069, 0x0304 } },
953     { 0x012C, { 0x0049, 0x0306 } },
954     { 0x012D, { 0x0069, 0x0306 } },
955     { 0x012E, { 0x0049, 0x0328 } },
956     { 0x012F, { 0x0069, 0x0328 } },
957     { 0x0130, { 0x0049, 0x0307 } },
958     { 0x0134, { 0x004A, 0x0302 } },
959     { 0x0135, { 0x006A, 0x0302 } },
960     { 0x0136, { 0x004B, 0x0327 } },
961     { 0x0137, { 0x006B, 0x0327 } },
962     { 0x0139, { 0x004C, 0x0301 } },
963     { 0x013A, { 0x006C, 0x0301 } },
964     { 0x013B, { 0x004C, 0x0327 } },
965     { 0x013C, { 0x006C, 0x0327 } },
966     { 0x013D, { 0x004C, 0x030C } },
967     { 0x013E, { 0x006C, 0x030C } },
968     { 0x0143, { 0x004E, 0x0301 } },
969     { 0x0144, { 0x006E, 0x0301 } },
970     { 0x0145, { 0x004E, 0x0327 } },
971     { 0x0146, { 0x006E, 0x0327 } },
972     { 0x0147, { 0x004E, 0x030C } },
973     { 0x0148, { 0x006E, 0x030C } },
974     { 0x014C, { 0x004F, 0x0304 } },
975     { 0x014D, { 0x006F, 0x0304 } },
976     { 0x014E, { 0x004F, 0x0306 } },
977     { 0x014F, { 0x006F, 0x0306 } },
978     { 0x0150, { 0x004F, 0x030B } },
979     { 0x0151, { 0x006F, 0x030B } },
980     { 0x0154, { 0x0052, 0x0301 } },
981     { 0x0155, { 0x0072, 0x0301 } },
982     { 0x0156, { 0x0052, 0x0327 } },
983     { 0x0157, { 0x0072, 0x0327 } },
984     { 0x0158, { 0x0052, 0x030C } },
985     { 0x0159, { 0x0072, 0x030C } },
986     { 0x015A, { 0x0053, 0x0301 } },
987     { 0x015B, { 0x0073, 0x0301 } },
988     { 0x015C, { 0x0053, 0x0302 } },
989     { 0x015D, { 0x0073, 0x0302 } },
990     { 0x015E, { 0x0053, 0x0327 } },
991     { 0x015F, { 0x0073, 0x0327 } },
992     { 0x0160, { 0x0053, 0x030C } },
993     { 0x0161, { 0x0073, 0x030C } },
994     { 0x0162, { 0x0054, 0x0327 } },
995     { 0x0163, { 0x0074, 0x0327 } },
996     { 0x0164, { 0x0054, 0x030C } },
997     { 0x0165, { 0x0074, 0x030C } },
998     { 0x0168, { 0x0055, 0x0303 } },
999     { 0x0169, { 0x0075, 0x0303 } },
1000     { 0x016A, { 0x0055, 0x0304 } },
1001     { 0x016B, { 0x0075, 0x0304 } },
1002     { 0x016C, { 0x0055, 0x0306 } },
1003     { 0x016D, { 0x0075, 0x0306 } },
1004     { 0x016E, { 0x0055, 0x030A } },
1005     { 0x016F, { 0x0075, 0x030A } },
1006     { 0x0170, { 0x0055, 0x030B } },
1007     { 0x0171, { 0x0075, 0x030B } },
1008     { 0x0172, { 0x0055, 0x0328 } },
1009     { 0x0173, { 0x0075, 0x0328 } },
1010     { 0x0174, { 0x0057, 0x0302 } },
1011     { 0x0175, { 0x0077, 0x0302 } },
1012     { 0x0176, { 0x0059, 0x0302 } },
1013     { 0x0177, { 0x0079, 0x0302 } },
1014     { 0x0178, { 0x0059, 0x0308 } },
1015     { 0x0179, { 0x005A, 0x0301 } },
1016     { 0x017A, { 0x007A, 0x0301 } },
1017     { 0x017B, { 0x005A, 0x0307 } },
1018     { 0x017C, { 0x007A, 0x0307 } },
1019     { 0x017D, { 0x005A, 0x030C } },
1020     { 0x017E, { 0x007A, 0x030C } },
1021     { 0x01A0, { 0x004F, 0x031B } },
1022     { 0x01A1, { 0x006F, 0x031B } },
1023     { 0x01AF, { 0x0055, 0x031B } },
1024     { 0x01B0, { 0x0075, 0x031B } },
1025     { 0x01CD, { 0x0041, 0x030C } },
1026     { 0x01CE, { 0x0061, 0x030C } },
1027     { 0x01CF, { 0x0049, 0x030C } },
1028     { 0x01D0, { 0x0069, 0x030C } },
1029     { 0x01D1, { 0x004F, 0x030C } },
1030     { 0x01D2, { 0x006F, 0x030C } },
1031     { 0x01D3, { 0x0055, 0x030C } },
1032     { 0x01D4, { 0x0075, 0x030C } },
1033     { 0x01D5, { 0x00DC, 0x0304 } },
1034     { 0x01D6, { 0x00FC, 0x0304 } },
1035     { 0x01D7, { 0x00DC, 0x0301 } },
1036     { 0x01D8, { 0x00FC, 0x0301 } },
1037     { 0x01D9, { 0x00DC, 0x030C } },
1038     { 0x01DA, { 0x00FC, 0x030C } },
1039     { 0x01DB, { 0x00DC, 0x0300 } },
1040     { 0x01DC, { 0x00FC, 0x0300 } },
1041     { 0x01DE, { 0x00C4, 0x0304 } },
1042     { 0x01DF, { 0x00E4, 0x0304 } },
1043     { 0x01E0, { 0x0226, 0x0304 } },
1044     { 0x01E1, { 0x0227, 0x0304 } },
1045     { 0x01E2, { 0x00C6, 0x0304 } },
1046     { 0x01E3, { 0x00E6, 0x0304 } },
1047     { 0x01E6, { 0x0047, 0x030C } },
1048     { 0x01E7, { 0x0067, 0x030C } },
1049     { 0x01E8, { 0x004B, 0x030C } },
1050     { 0x01E9, { 0x006B, 0x030C } },
1051     { 0x01EA, { 0x004F, 0x0328 } },
1052     { 0x01EB, { 0x006F, 0x0328 } },
1053     { 0x01EC, { 0x01EA, 0x0304 } },
1054     { 0x01ED, { 0x01EB, 0x0304 } },
1055     { 0x01EE, { 0x01B7, 0x030C } },
1056     { 0x01EF, { 0x0292, 0x030C } },
1057     { 0x01F0, { 0x006A, 0x030C } },
1058     { 0x01F4, { 0x0047, 0x0301 } },
1059     { 0x01F5, { 0x0067, 0x0301 } },
1060     { 0x01F8, { 0x004E, 0x0300 } },
1061     { 0x01F9, { 0x006E, 0x0300 } },
1062     { 0x01FA, { 0x00C5, 0x0301 } },
1063     { 0x01FB, { 0x00E5, 0x0301 } },
1064     { 0x01FC, { 0x00C6, 0x0301 } },
1065     { 0x01FD, { 0x00E6, 0x0301 } },
1066     { 0x01FE, { 0x00D8, 0x0301 } },
1067     { 0x01FF, { 0x00F8, 0x0301 } },
1068     { 0x0200, { 0x0041, 0x030F } },
1069     { 0x0201, { 0x0061, 0x030F } },
1070     { 0x0202, { 0x0041, 0x0311 } },
1071     { 0x0203, { 0x0061, 0x0311 } },
1072     { 0x0204, { 0x0045, 0x030F } },
1073     { 0x0205, { 0x0065, 0x030F } },
1074     { 0x0206, { 0x0045, 0x0311 } },
1075     { 0x0207, { 0x0065, 0x0311 } },
1076     { 0x0208, { 0x0049, 0x030F } },
1077     { 0x0209, { 0x0069, 0x030F } },
1078     { 0x020A, { 0x0049, 0x0311 } },
1079     { 0x020B, { 0x0069, 0x0311 } },
1080     { 0x020C, { 0x004F, 0x030F } },
1081     { 0x020D, { 0x006F, 0x030F } },
1082     { 0x020E, { 0x004F, 0x0311 } },
1083     { 0x020F, { 0x006F, 0x0311 } },
1084     { 0x0210, { 0x0052, 0x030F } },
1085     { 0x0211, { 0x0072, 0x030F } },
1086     { 0x0212, { 0x0052, 0x0311 } },
1087     { 0x0213, { 0x0072, 0x0311 } },
1088     { 0x0214, { 0x0055, 0x030F } },
1089     { 0x0215, { 0x0075, 0x030F } },
1090     { 0x0216, { 0x0055, 0x0311 } },
1091     { 0x0217, { 0x0075, 0x0311 } },
1092     { 0x0218, { 0x0053, 0x0326 } },
1093     { 0x0219, { 0x0073, 0x0326 } },
1094     { 0x021A, { 0x0054, 0x0326 } },
1095     { 0x021B, { 0x0074, 0x0326 } },
1096     { 0x021E, { 0x0048, 0x030C } },
1097     { 0x021F, { 0x0068, 0x030C } },
1098     { 0x0226, { 0x0041, 0x0307 } },
1099     { 0x0227, { 0x0061, 0x0307 } },
1100     { 0x0228, { 0x0045, 0x0327 } },
1101     { 0x0229, { 0x0065, 0x0327 } },
1102     { 0x022A, { 0x00D6, 0x0304 } },
1103     { 0x022B, { 0x00F6, 0x0304 } },
1104     { 0x022C, { 0x00D5, 0x0304 } },
1105     { 0x022D, { 0x00F5, 0x0304 } },
1106     { 0x022E, { 0x004F, 0x0307 } },
1107     { 0x022F, { 0x006F, 0x0307 } },
1108     { 0x0230, { 0x022E, 0x0304 } },
1109     { 0x0231, { 0x022F, 0x0304 } },
1110     { 0x0232, { 0x0059, 0x0304 } },
1111     { 0x0233, { 0x0079, 0x0304 } },
1112     { 0x0340, { 0x0300, 0 } },
1113     { 0x0341, { 0x0301, 0 } },
1114     { 0x0343, { 0x0313, 0 } },
1115     { 0x0344, { 0x0308, 0x0301 } },
1116     { 0x0374, { 0x02B9, 0 } },
1117     { 0x037E, { 0x003B, 0 } },
1118     { 0x0385, { 0x00A8, 0x0301 } },
1119     { 0x0386, { 0x0391, 0x0301 } },
1120     { 0x0387, { 0x00B7, 0 } },
1121     { 0x0388, { 0x0395, 0x0301 } },
1122     { 0x0389, { 0x0397, 0x0301 } },
1123     { 0x038A, { 0x0399, 0x0301 } },
1124     { 0x038C, { 0x039F, 0x0301 } },
1125     { 0x038E, { 0x03A5, 0x0301 } },
1126     { 0x038F, { 0x03A9, 0x0301 } },
1127     { 0x0390, { 0x03CA, 0x0301 } },
1128     { 0x03AA, { 0x0399, 0x0308 } },
1129     { 0x03AB, { 0x03A5, 0x0308 } },
1130     { 0x03AC, { 0x03B1, 0x0301 } },
1131     { 0x03AD, { 0x03B5, 0x0301 } },
1132     { 0x03AE, { 0x03B7, 0x0301 } },
1133     { 0x03AF, { 0x03B9, 0x0301 } },
1134     { 0x03B0, { 0x03CB, 0x0301 } },
1135     { 0x03CA, { 0x03B9, 0x0308 } },
1136     { 0x03CB, { 0x03C5, 0x0308 } },
1137     { 0x03CC, { 0x03BF, 0x0301 } },
1138     { 0x03CD, { 0x03C5, 0x0301 } },
1139     { 0x03CE, { 0x03C9, 0x0301 } },
1140     { 0x03D3, { 0x03D2, 0x0301 } },
1141     { 0x03D4, { 0x03D2, 0x0308 } },
1142     { 0x0400, { 0x0415, 0x0300 } },
1143     { 0x0401, { 0x0415, 0x0308 } },
1144     { 0x0403, { 0x0413, 0x0301 } },
1145     { 0x0407, { 0x0406, 0x0308 } },
1146     { 0x040C, { 0x041A, 0x0301 } },
1147     { 0x040D, { 0x0418, 0x0300 } },
1148     { 0x040E, { 0x0423, 0x0306 } },
1149     { 0x0419, { 0x0418, 0x0306 } },
1150     { 0x0439, { 0x0438, 0x0306 } },
1151     { 0x0450, { 0x0435, 0x0300 } },
1152     { 0x0451, { 0x0435, 0x0308 } },
1153     { 0x0453, { 0x0433, 0x0301 } },
1154     { 0x0457, { 0x0456, 0x0308 } },
1155     { 0x045C, { 0x043A, 0x0301 } },
1156     { 0x045D, { 0x0438, 0x0300 } },
1157     { 0x045E, { 0x0443, 0x0306 } },
1158     { 0x0476, { 0x0474, 0x030F } },
1159     { 0x0477, { 0x0475, 0x030F } },
1160     { 0x04C1, { 0x0416, 0x0306 } },
1161     { 0x04C2, { 0x0436, 0x0306 } },
1162     { 0x04D0, { 0x0410, 0x0306 } },
1163     { 0x04D1, { 0x0430, 0x0306 } },
1164     { 0x04D2, { 0x0410, 0x0308 } },
1165     { 0x04D3, { 0x0430, 0x0308 } },
1166     { 0x04D6, { 0x0415, 0x0306 } },
1167     { 0x04D7, { 0x0435, 0x0306 } },
1168     { 0x04DA, { 0x04D8, 0x0308 } },
1169     { 0x04DB, { 0x04D9, 0x0308 } },
1170     { 0x04DC, { 0x0416, 0x0308 } },
1171     { 0x04DD, { 0x0436, 0x0308 } },
1172     { 0x04DE, { 0x0417, 0x0308 } },
1173     { 0x04DF, { 0x0437, 0x0308 } },
1174     { 0x04E2, { 0x0418, 0x0304 } },
1175     { 0x04E3, { 0x0438, 0x0304 } },
1176     { 0x04E4, { 0x0418, 0x0308 } },
1177     { 0x04E5, { 0x0438, 0x0308 } },
1178     { 0x04E6, { 0x041E, 0x0308 } },
1179     { 0x04E7, { 0x043E, 0x0308 } },
1180     { 0x04EA, { 0x04E8, 0x0308 } },
1181     { 0x04EB, { 0x04E9, 0x0308 } },
1182     { 0x04EC, { 0x042D, 0x0308 } },
1183     { 0x04ED, { 0x044D, 0x0308 } },
1184     { 0x04EE, { 0x0423, 0x0304 } },
1185     { 0x04EF, { 0x0443, 0x0304 } },
1186     { 0x04F0, { 0x0423, 0x0308 } },
1187     { 0x04F1, { 0x0443, 0x0308 } },
1188     { 0x04F2, { 0x0423, 0x030B } },
1189     { 0x04F3, { 0x0443, 0x030B } },
1190     { 0x04F4, { 0x0427, 0x0308 } },
1191     { 0x04F5, { 0x0447, 0x0308 } },
1192     { 0x04F8, { 0x042B, 0x0308 } },
1193     { 0x04F9, { 0x044B, 0x0308 } },
1194     { 0x0622, { 0x0627, 0x0653 } },
1195     { 0x0623, { 0x0627, 0x0654 } },
1196     { 0x0624, { 0x0648, 0x0654 } },
1197     { 0x0625, { 0x0627, 0x0655 } },
1198     { 0x0626, { 0x064A, 0x0654 } },
1199     { 0x06C0, { 0x06D5, 0x0654 } },
1200     { 0x06C2, { 0x06C1, 0x0654 } },
1201     { 0x06D3, { 0x06D2, 0x0654 } },
1202     { 0x0929, { 0x0928, 0x093C } },
1203     { 0x0931, { 0x0930, 0x093C } },
1204     { 0x0934, { 0x0933, 0x093C } },
1205     { 0x0958, { 0x0915, 0x093C } },
1206     { 0x0959, { 0x0916, 0x093C } },
1207     { 0x095A, { 0x0917, 0x093C } },
1208     { 0x095B, { 0x091C, 0x093C } },
1209     { 0x095C, { 0x0921, 0x093C } },
1210     { 0x095D, { 0x0922, 0x093C } },
1211     { 0x095E, { 0x092B, 0x093C } },
1212     { 0x095F, { 0x092F, 0x093C } },
1213     { 0x09CB, { 0x09C7, 0x09BE } },
1214     { 0x09CC, { 0x09C7, 0x09D7 } },
1215     { 0x09DC, { 0x09A1, 0x09BC } },
1216     { 0x09DD, { 0x09A2, 0x09BC } },
1217     { 0x09DF, { 0x09AF, 0x09BC } },
1218     { 0x0A33, { 0x0A32, 0x0A3C } },
1219     { 0x0A36, { 0x0A38, 0x0A3C } },
1220     { 0x0A59, { 0x0A16, 0x0A3C } },
1221     { 0x0A5A, { 0x0A17, 0x0A3C } },
1222     { 0x0A5B, { 0x0A1C, 0x0A3C } },
1223     { 0x0A5E, { 0x0A2B, 0x0A3C } },
1224     { 0x0B48, { 0x0B47, 0x0B56 } },
1225     { 0x0B4B, { 0x0B47, 0x0B3E } },
1226     { 0x0B4C, { 0x0B47, 0x0B57 } },
1227     { 0x0B5C, { 0x0B21, 0x0B3C } },
1228     { 0x0B5D, { 0x0B22, 0x0B3C } },
1229     { 0x0B94, { 0x0B92, 0x0BD7 } },
1230     { 0x0BCA, { 0x0BC6, 0x0BBE } },
1231     { 0x0BCB, { 0x0BC7, 0x0BBE } },
1232     { 0x0BCC, { 0x0BC6, 0x0BD7 } },
1233     { 0x0C48, { 0x0C46, 0x0C56 } },
1234     { 0x0CC0, { 0x0CBF, 0x0CD5 } },
1235     { 0x0CC7, { 0x0CC6, 0x0CD5 } },
1236     { 0x0CC8, { 0x0CC6, 0x0CD6 } },
1237     { 0x0CCA, { 0x0CC6, 0x0CC2 } },
1238     { 0x0CCB, { 0x0CCA, 0x0CD5 } },
1239     { 0x0D4A, { 0x0D46, 0x0D3E } },
1240     { 0x0D4B, { 0x0D47, 0x0D3E } },
1241     { 0x0D4C, { 0x0D46, 0x0D57 } },
1242     { 0x0DDA, { 0x0DD9, 0x0DCA } },
1243     { 0x0DDC, { 0x0DD9, 0x0DCF } },
1244     { 0x0DDD, { 0x0DDC, 0x0DCA } },
1245     { 0x0DDE, { 0x0DD9, 0x0DDF } },
1246     { 0x0F43, { 0x0F42, 0x0FB7 } },
1247     { 0x0F4D, { 0x0F4C, 0x0FB7 } },
1248     { 0x0F52, { 0x0F51, 0x0FB7 } },
1249     { 0x0F57, { 0x0F56, 0x0FB7 } },
1250     { 0x0F5C, { 0x0F5B, 0x0FB7 } },
1251     { 0x0F69, { 0x0F40, 0x0FB5 } },
1252     { 0x0F73, { 0x0F71, 0x0F72 } },
1253     { 0x0F75, { 0x0F71, 0x0F74 } },
1254     { 0x0F76, { 0x0FB2, 0x0F80 } },
1255     { 0x0F78, { 0x0FB3, 0x0F80 } },
1256     { 0x0F81, { 0x0F71, 0x0F80 } },
1257     { 0x0F93, { 0x0F92, 0x0FB7 } },
1258     { 0x0F9D, { 0x0F9C, 0x0FB7 } },
1259     { 0x0FA2, { 0x0FA1, 0x0FB7 } },
1260     { 0x0FA7, { 0x0FA6, 0x0FB7 } },
1261     { 0x0FAC, { 0x0FAB, 0x0FB7 } },
1262     { 0x0FB9, { 0x0F90, 0x0FB5 } },
1263     { 0x1026, { 0x1025, 0x102E } },
1264     { 0x1B06, { 0x1B05, 0x1B35 } },
1265     { 0x1B08, { 0x1B07, 0x1B35 } },
1266     { 0x1B0A, { 0x1B09, 0x1B35 } },
1267     { 0x1B0C, { 0x1B0B, 0x1B35 } },
1268     { 0x1B0E, { 0x1B0D, 0x1B35 } },
1269     { 0x1B12, { 0x1B11, 0x1B35 } },
1270     { 0x1B3B, { 0x1B3A, 0x1B35 } },
1271     { 0x1B3D, { 0x1B3C, 0x1B35 } },
1272     { 0x1B40, { 0x1B3E, 0x1B35 } },
1273     { 0x1B41, { 0x1B3F, 0x1B35 } },
1274     { 0x1B43, { 0x1B42, 0x1B35 } },
1275     { 0x1E00, { 0x0041, 0x0325 } },
1276     { 0x1E01, { 0x0061, 0x0325 } },
1277     { 0x1E02, { 0x0042, 0x0307 } },
1278     { 0x1E03, { 0x0062, 0x0307 } },
1279     { 0x1E04, { 0x0042, 0x0323 } },
1280     { 0x1E05, { 0x0062, 0x0323 } },
1281     { 0x1E06, { 0x0042, 0x0331 } },
1282     { 0x1E07, { 0x0062, 0x0331 } },
1283     { 0x1E08, { 0x00C7, 0x0301 } },
1284     { 0x1E09, { 0x00E7, 0x0301 } },
1285     { 0x1E0A, { 0x0044, 0x0307 } },
1286     { 0x1E0B, { 0x0064, 0x0307 } },
1287     { 0x1E0C, { 0x0044, 0x0323 } },
1288     { 0x1E0D, { 0x0064, 0x0323 } },
1289     { 0x1E0E, { 0x0044, 0x0331 } },
1290     { 0x1E0F, { 0x0064, 0x0331 } },
1291     { 0x1E10, { 0x0044, 0x0327 } },
1292     { 0x1E11, { 0x0064, 0x0327 } },
1293     { 0x1E12, { 0x0044, 0x032D } },
1294     { 0x1E13, { 0x0064, 0x032D } },
1295     { 0x1E14, { 0x0112, 0x0300 } },
1296     { 0x1E15, { 0x0113, 0x0300 } },
1297     { 0x1E16, { 0x0112, 0x0301 } },
1298     { 0x1E17, { 0x0113, 0x0301 } },
1299     { 0x1E18, { 0x0045, 0x032D } },
1300     { 0x1E19, { 0x0065, 0x032D } },
1301     { 0x1E1A, { 0x0045, 0x0330 } },
1302     { 0x1E1B, { 0x0065, 0x0330 } },
1303     { 0x1E1C, { 0x0228, 0x0306 } },
1304     { 0x1E1D, { 0x0229, 0x0306 } },
1305     { 0x1E1E, { 0x0046, 0x0307 } },
1306     { 0x1E1F, { 0x0066, 0x0307 } },
1307     { 0x1E20, { 0x0047, 0x0304 } },
1308     { 0x1E21, { 0x0067, 0x0304 } },
1309     { 0x1E22, { 0x0048, 0x0307 } },
1310     { 0x1E23, { 0x0068, 0x0307 } },
1311     { 0x1E24, { 0x0048, 0x0323 } },
1312     { 0x1E25, { 0x0068, 0x0323 } },
1313     { 0x1E26, { 0x0048, 0x0308 } },
1314     { 0x1E27, { 0x0068, 0x0308 } },
1315     { 0x1E28, { 0x0048, 0x0327 } },
1316     { 0x1E29, { 0x0068, 0x0327 } },
1317     { 0x1E2A, { 0x0048, 0x032E } },
1318     { 0x1E2B, { 0x0068, 0x032E } },
1319     { 0x1E2C, { 0x0049, 0x0330 } },
1320     { 0x1E2D, { 0x0069, 0x0330 } },
1321     { 0x1E2E, { 0x00CF, 0x0301 } },
1322     { 0x1E2F, { 0x00EF, 0x0301 } },
1323     { 0x1E30, { 0x004B, 0x0301 } },
1324     { 0x1E31, { 0x006B, 0x0301 } },
1325     { 0x1E32, { 0x004B, 0x0323 } },
1326     { 0x1E33, { 0x006B, 0x0323 } },
1327     { 0x1E34, { 0x004B, 0x0331 } },
1328     { 0x1E35, { 0x006B, 0x0331 } },
1329     { 0x1E36, { 0x004C, 0x0323 } },
1330     { 0x1E37, { 0x006C, 0x0323 } },
1331     { 0x1E38, { 0x1E36, 0x0304 } },
1332     { 0x1E39, { 0x1E37, 0x0304 } },
1333     { 0x1E3A, { 0x004C, 0x0331 } },
1334     { 0x1E3B, { 0x006C, 0x0331 } },
1335     { 0x1E3C, { 0x004C, 0x032D } },
1336     { 0x1E3D, { 0x006C, 0x032D } },
1337     { 0x1E3E, { 0x004D, 0x0301 } },
1338     { 0x1E3F, { 0x006D, 0x0301 } },
1339     { 0x1E40, { 0x004D, 0x0307 } },
1340     { 0x1E41, { 0x006D, 0x0307 } },
1341     { 0x1E42, { 0x004D, 0x0323 } },
1342     { 0x1E43, { 0x006D, 0x0323 } },
1343     { 0x1E44, { 0x004E, 0x0307 } },
1344     { 0x1E45, { 0x006E, 0x0307 } },
1345     { 0x1E46, { 0x004E, 0x0323 } },
1346     { 0x1E47, { 0x006E, 0x0323 } },
1347     { 0x1E48, { 0x004E, 0x0331 } },
1348     { 0x1E49, { 0x006E, 0x0331 } },
1349     { 0x1E4A, { 0x004E, 0x032D } },
1350     { 0x1E4B, { 0x006E, 0x032D } },
1351     { 0x1E4C, { 0x00D5, 0x0301 } },
1352     { 0x1E4D, { 0x00F5, 0x0301 } },
1353     { 0x1E4E, { 0x00D5, 0x0308 } },
1354     { 0x1E4F, { 0x00F5, 0x0308 } },
1355     { 0x1E50, { 0x014C, 0x0300 } },
1356     { 0x1E51, { 0x014D, 0x0300 } },
1357     { 0x1E52, { 0x014C, 0x0301 } },
1358     { 0x1E53, { 0x014D, 0x0301 } },
1359     { 0x1E54, { 0x0050, 0x0301 } },
1360     { 0x1E55, { 0x0070, 0x0301 } },
1361     { 0x1E56, { 0x0050, 0x0307 } },
1362     { 0x1E57, { 0x0070, 0x0307 } },
1363     { 0x1E58, { 0x0052, 0x0307 } },
1364     { 0x1E59, { 0x0072, 0x0307 } },
1365     { 0x1E5A, { 0x0052, 0x0323 } },
1366     { 0x1E5B, { 0x0072, 0x0323 } },
1367     { 0x1E5C, { 0x1E5A, 0x0304 } },
1368     { 0x1E5D, { 0x1E5B, 0x0304 } },
1369     { 0x1E5E, { 0x0052, 0x0331 } },
1370     { 0x1E5F, { 0x0072, 0x0331 } },
1371     { 0x1E60, { 0x0053, 0x0307 } },
1372     { 0x1E61, { 0x0073, 0x0307 } },
1373     { 0x1E62, { 0x0053, 0x0323 } },
1374     { 0x1E63, { 0x0073, 0x0323 } },
1375     { 0x1E64, { 0x015A, 0x0307 } },
1376     { 0x1E65, { 0x015B, 0x0307 } },
1377     { 0x1E66, { 0x0160, 0x0307 } },
1378     { 0x1E67, { 0x0161, 0x0307 } },
1379     { 0x1E68, { 0x1E62, 0x0307 } },
1380     { 0x1E69, { 0x1E63, 0x0307 } },
1381     { 0x1E6A, { 0x0054, 0x0307 } },
1382     { 0x1E6B, { 0x0074, 0x0307 } },
1383     { 0x1E6C, { 0x0054, 0x0323 } },
1384     { 0x1E6D, { 0x0074, 0x0323 } },
1385     { 0x1E6E, { 0x0054, 0x0331 } },
1386     { 0x1E6F, { 0x0074, 0x0331 } },
1387     { 0x1E70, { 0x0054, 0x032D } },
1388     { 0x1E71, { 0x0074, 0x032D } },
1389     { 0x1E72, { 0x0055, 0x0324 } },
1390     { 0x1E73, { 0x0075, 0x0324 } },
1391     { 0x1E74, { 0x0055, 0x0330 } },
1392     { 0x1E75, { 0x0075, 0x0330 } },
1393     { 0x1E76, { 0x0055, 0x032D } },
1394     { 0x1E77, { 0x0075, 0x032D } },
1395     { 0x1E78, { 0x0168, 0x0301 } },
1396     { 0x1E79, { 0x0169, 0x0301 } },
1397     { 0x1E7A, { 0x016A, 0x0308 } },
1398     { 0x1E7B, { 0x016B, 0x0308 } },
1399     { 0x1E7C, { 0x0056, 0x0303 } },
1400     { 0x1E7D, { 0x0076, 0x0303 } },
1401     { 0x1E7E, { 0x0056, 0x0323 } },
1402     { 0x1E7F, { 0x0076, 0x0323 } },
1403     { 0x1E80, { 0x0057, 0x0300 } },
1404     { 0x1E81, { 0x0077, 0x0300 } },
1405     { 0x1E82, { 0x0057, 0x0301 } },
1406     { 0x1E83, { 0x0077, 0x0301 } },
1407     { 0x1E84, { 0x0057, 0x0308 } },
1408     { 0x1E85, { 0x0077, 0x0308 } },
1409     { 0x1E86, { 0x0057, 0x0307 } },
1410     { 0x1E87, { 0x0077, 0x0307 } },
1411     { 0x1E88, { 0x0057, 0x0323 } },
1412     { 0x1E89, { 0x0077, 0x0323 } },
1413     { 0x1E8A, { 0x0058, 0x0307 } },
1414     { 0x1E8B, { 0x0078, 0x0307 } },
1415     { 0x1E8C, { 0x0058, 0x0308 } },
1416     { 0x1E8D, { 0x0078, 0x0308 } },
1417     { 0x1E8E, { 0x0059, 0x0307 } },
1418     { 0x1E8F, { 0x0079, 0x0307 } },
1419     { 0x1E90, { 0x005A, 0x0302 } },
1420     { 0x1E91, { 0x007A, 0x0302 } },
1421     { 0x1E92, { 0x005A, 0x0323 } },
1422     { 0x1E93, { 0x007A, 0x0323 } },
1423     { 0x1E94, { 0x005A, 0x0331 } },
1424     { 0x1E95, { 0x007A, 0x0331 } },
1425     { 0x1E96, { 0x0068, 0x0331 } },
1426     { 0x1E97, { 0x0074, 0x0308 } },
1427     { 0x1E98, { 0x0077, 0x030A } },
1428     { 0x1E99, { 0x0079, 0x030A } },
1429     { 0x1E9B, { 0x017F, 0x0307 } },
1430     { 0x1EA0, { 0x0041, 0x0323 } },
1431     { 0x1EA1, { 0x0061, 0x0323 } },
1432     { 0x1EA2, { 0x0041, 0x0309 } },
1433     { 0x1EA3, { 0x0061, 0x0309 } },
1434     { 0x1EA4, { 0x00C2, 0x0301 } },
1435     { 0x1EA5, { 0x00E2, 0x0301 } },
1436     { 0x1EA6, { 0x00C2, 0x0300 } },
1437     { 0x1EA7, { 0x00E2, 0x0300 } },
1438     { 0x1EA8, { 0x00C2, 0x0309 } },
1439     { 0x1EA9, { 0x00E2, 0x0309 } },
1440     { 0x1EAA, { 0x00C2, 0x0303 } },
1441     { 0x1EAB, { 0x00E2, 0x0303 } },
1442     { 0x1EAC, { 0x1EA0, 0x0302 } },
1443     { 0x1EAD, { 0x1EA1, 0x0302 } },
1444     { 0x1EAE, { 0x0102, 0x0301 } },
1445     { 0x1EAF, { 0x0103, 0x0301 } },
1446     { 0x1EB0, { 0x0102, 0x0300 } },
1447     { 0x1EB1, { 0x0103, 0x0300 } },
1448     { 0x1EB2, { 0x0102, 0x0309 } },
1449     { 0x1EB3, { 0x0103, 0x0309 } },
1450     { 0x1EB4, { 0x0102, 0x0303 } },
1451     { 0x1EB5, { 0x0103, 0x0303 } },
1452     { 0x1EB6, { 0x1EA0, 0x0306 } },
1453     { 0x1EB7, { 0x1EA1, 0x0306 } },
1454     { 0x1EB8, { 0x0045, 0x0323 } },
1455     { 0x1EB9, { 0x0065, 0x0323 } },
1456     { 0x1EBA, { 0x0045, 0x0309 } },
1457     { 0x1EBB, { 0x0065, 0x0309 } },
1458     { 0x1EBC, { 0x0045, 0x0303 } },
1459     { 0x1EBD, { 0x0065, 0x0303 } },
1460     { 0x1EBE, { 0x00CA, 0x0301 } },
1461     { 0x1EBF, { 0x00EA, 0x0301 } },
1462     { 0x1EC0, { 0x00CA, 0x0300 } },
1463     { 0x1EC1, { 0x00EA, 0x0300 } },
1464     { 0x1EC2, { 0x00CA, 0x0309 } },
1465     { 0x1EC3, { 0x00EA, 0x0309 } },
1466     { 0x1EC4, { 0x00CA, 0x0303 } },
1467     { 0x1EC5, { 0x00EA, 0x0303 } },
1468     { 0x1EC6, { 0x1EB8, 0x0302 } },
1469     { 0x1EC7, { 0x1EB9, 0x0302 } },
1470     { 0x1EC8, { 0x0049, 0x0309 } },
1471     { 0x1EC9, { 0x0069, 0x0309 } },
1472     { 0x1ECA, { 0x0049, 0x0323 } },
1473     { 0x1ECB, { 0x0069, 0x0323 } },
1474     { 0x1ECC, { 0x004F, 0x0323 } },
1475     { 0x1ECD, { 0x006F, 0x0323 } },
1476     { 0x1ECE, { 0x004F, 0x0309 } },
1477     { 0x1ECF, { 0x006F, 0x0309 } },
1478     { 0x1ED0, { 0x00D4, 0x0301 } },
1479     { 0x1ED1, { 0x00F4, 0x0301 } },
1480     { 0x1ED2, { 0x00D4, 0x0300 } },
1481     { 0x1ED3, { 0x00F4, 0x0300 } },
1482     { 0x1ED4, { 0x00D4, 0x0309 } },
1483     { 0x1ED5, { 0x00F4, 0x0309 } },
1484     { 0x1ED6, { 0x00D4, 0x0303 } },
1485     { 0x1ED7, { 0x00F4, 0x0303 } },
1486     { 0x1ED8, { 0x1ECC, 0x0302 } },
1487     { 0x1ED9, { 0x1ECD, 0x0302 } },
1488     { 0x1EDA, { 0x01A0, 0x0301 } },
1489     { 0x1EDB, { 0x01A1, 0x0301 } },
1490     { 0x1EDC, { 0x01A0, 0x0300 } },
1491     { 0x1EDD, { 0x01A1, 0x0300 } },
1492     { 0x1EDE, { 0x01A0, 0x0309 } },
1493     { 0x1EDF, { 0x01A1, 0x0309 } },
1494     { 0x1EE0, { 0x01A0, 0x0303 } },
1495     { 0x1EE1, { 0x01A1, 0x0303 } },
1496     { 0x1EE2, { 0x01A0, 0x0323 } },
1497     { 0x1EE3, { 0x01A1, 0x0323 } },
1498     { 0x1EE4, { 0x0055, 0x0323 } },
1499     { 0x1EE5, { 0x0075, 0x0323 } },
1500     { 0x1EE6, { 0x0055, 0x0309 } },
1501     { 0x1EE7, { 0x0075, 0x0309 } },
1502     { 0x1EE8, { 0x01AF, 0x0301 } },
1503     { 0x1EE9, { 0x01B0, 0x0301 } },
1504     { 0x1EEA, { 0x01AF, 0x0300 } },
1505     { 0x1EEB, { 0x01B0, 0x0300 } },
1506     { 0x1EEC, { 0x01AF, 0x0309 } },
1507     { 0x1EED, { 0x01B0, 0x0309 } },
1508     { 0x1EEE, { 0x01AF, 0x0303 } },
1509     { 0x1EEF, { 0x01B0, 0x0303 } },
1510     { 0x1EF0, { 0x01AF, 0x0323 } },
1511     { 0x1EF1, { 0x01B0, 0x0323 } },
1512     { 0x1EF2, { 0x0059, 0x0300 } },
1513     { 0x1EF3, { 0x0079, 0x0300 } },
1514     { 0x1EF4, { 0x0059, 0x0323 } },
1515     { 0x1EF5, { 0x0079, 0x0323 } },
1516     { 0x1EF6, { 0x0059, 0x0309 } },
1517     { 0x1EF7, { 0x0079, 0x0309 } },
1518     { 0x1EF8, { 0x0059, 0x0303 } },
1519     { 0x1EF9, { 0x0079, 0x0303 } },
1520     { 0x1F00, { 0x03B1, 0x0313 } },
1521     { 0x1F01, { 0x03B1, 0x0314 } },
1522     { 0x1F02, { 0x1F00, 0x0300 } },
1523     { 0x1F03, { 0x1F01, 0x0300 } },
1524     { 0x1F04, { 0x1F00, 0x0301 } },
1525     { 0x1F05, { 0x1F01, 0x0301 } },
1526     { 0x1F06, { 0x1F00, 0x0342 } },
1527     { 0x1F07, { 0x1F01, 0x0342 } },
1528     { 0x1F08, { 0x0391, 0x0313 } },
1529     { 0x1F09, { 0x0391, 0x0314 } },
1530     { 0x1F0A, { 0x1F08, 0x0300 } },
1531     { 0x1F0B, { 0x1F09, 0x0300 } },
1532     { 0x1F0C, { 0x1F08, 0x0301 } },
1533     { 0x1F0D, { 0x1F09, 0x0301 } },
1534     { 0x1F0E, { 0x1F08, 0x0342 } },
1535     { 0x1F0F, { 0x1F09, 0x0342 } },
1536     { 0x1F10, { 0x03B5, 0x0313 } },
1537     { 0x1F11, { 0x03B5, 0x0314 } },
1538     { 0x1F12, { 0x1F10, 0x0300 } },
1539     { 0x1F13, { 0x1F11, 0x0300 } },
1540     { 0x1F14, { 0x1F10, 0x0301 } },
1541     { 0x1F15, { 0x1F11, 0x0301 } },
1542     { 0x1F18, { 0x0395, 0x0313 } },
1543     { 0x1F19, { 0x0395, 0x0314 } },
1544     { 0x1F1A, { 0x1F18, 0x0300 } },
1545     { 0x1F1B, { 0x1F19, 0x0300 } },
1546     { 0x1F1C, { 0x1F18, 0x0301 } },
1547     { 0x1F1D, { 0x1F19, 0x0301 } },
1548     { 0x1F20, { 0x03B7, 0x0313 } },
1549     { 0x1F21, { 0x03B7, 0x0314 } },
1550     { 0x1F22, { 0x1F20, 0x0300 } },
1551     { 0x1F23, { 0x1F21, 0x0300 } },
1552     { 0x1F24, { 0x1F20, 0x0301 } },
1553     { 0x1F25, { 0x1F21, 0x0301 } },
1554     { 0x1F26, { 0x1F20, 0x0342 } },
1555     { 0x1F27, { 0x1F21, 0x0342 } },
1556     { 0x1F28, { 0x0397, 0x0313 } },
1557     { 0x1F29, { 0x0397, 0x0314 } },
1558     { 0x1F2A, { 0x1F28, 0x0300 } },
1559     { 0x1F2B, { 0x1F29, 0x0300 } },
1560     { 0x1F2C, { 0x1F28, 0x0301 } },
1561     { 0x1F2D, { 0x1F29, 0x0301 } },
1562     { 0x1F2E, { 0x1F28, 0x0342 } },
1563     { 0x1F2F, { 0x1F29, 0x0342 } },
1564     { 0x1F30, { 0x03B9, 0x0313 } },
1565     { 0x1F31, { 0x03B9, 0x0314 } },
1566     { 0x1F32, { 0x1F30, 0x0300 } },
1567     { 0x1F33, { 0x1F31, 0x0300 } },
1568     { 0x1F34, { 0x1F30, 0x0301 } },
1569     { 0x1F35, { 0x1F31, 0x0301 } },
1570     { 0x1F36, { 0x1F30, 0x0342 } },
1571     { 0x1F37, { 0x1F31, 0x0342 } },
1572     { 0x1F38, { 0x0399, 0x0313 } },
1573     { 0x1F39, { 0x0399, 0x0314 } },
1574     { 0x1F3A, { 0x1F38, 0x0300 } },
1575     { 0x1F3B, { 0x1F39, 0x0300 } },
1576     { 0x1F3C, { 0x1F38, 0x0301 } },
1577     { 0x1F3D, { 0x1F39, 0x0301 } },
1578     { 0x1F3E, { 0x1F38, 0x0342 } },
1579     { 0x1F3F, { 0x1F39, 0x0342 } },
1580     { 0x1F40, { 0x03BF, 0x0313 } },
1581     { 0x1F41, { 0x03BF, 0x0314 } },
1582     { 0x1F42, { 0x1F40, 0x0300 } },
1583     { 0x1F43, { 0x1F41, 0x0300 } },
1584     { 0x1F44, { 0x1F40, 0x0301 } },
1585     { 0x1F45, { 0x1F41, 0x0301 } },
1586     { 0x1F48, { 0x039F, 0x0313 } },
1587     { 0x1F49, { 0x039F, 0x0314 } },
1588     { 0x1F4A, { 0x1F48, 0x0300 } },
1589     { 0x1F4B, { 0x1F49, 0x0300 } },
1590     { 0x1F4C, { 0x1F48, 0x0301 } },
1591     { 0x1F4D, { 0x1F49, 0x0301 } },
1592     { 0x1F50, { 0x03C5, 0x0313 } },
1593     { 0x1F51, { 0x03C5, 0x0314 } },
1594     { 0x1F52, { 0x1F50, 0x0300 } },
1595     { 0x1F53, { 0x1F51, 0x0300 } },
1596     { 0x1F54, { 0x1F50, 0x0301 } },
1597     { 0x1F55, { 0x1F51, 0x0301 } },
1598     { 0x1F56, { 0x1F50, 0x0342 } },
1599     { 0x1F57, { 0x1F51, 0x0342 } },
1600     { 0x1F59, { 0x03A5, 0x0314 } },
1601     { 0x1F5B, { 0x1F59, 0x0300 } },
1602     { 0x1F5D, { 0x1F59, 0x0301 } },
1603     { 0x1F5F, { 0x1F59, 0x0342 } },
1604     { 0x1F60, { 0x03C9, 0x0313 } },
1605     { 0x1F61, { 0x03C9, 0x0314 } },
1606     { 0x1F62, { 0x1F60, 0x0300 } },
1607     { 0x1F63, { 0x1F61, 0x0300 } },
1608     { 0x1F64, { 0x1F60, 0x0301 } },
1609     { 0x1F65, { 0x1F61, 0x0301 } },
1610     { 0x1F66, { 0x1F60, 0x0342 } },
1611     { 0x1F67, { 0x1F61, 0x0342 } },
1612     { 0x1F68, { 0x03A9, 0x0313 } },
1613     { 0x1F69, { 0x03A9, 0x0314 } },
1614     { 0x1F6A, { 0x1F68, 0x0300 } },
1615     { 0x1F6B, { 0x1F69, 0x0300 } },
1616     { 0x1F6C, { 0x1F68, 0x0301 } },
1617     { 0x1F6D, { 0x1F69, 0x0301 } },
1618     { 0x1F6E, { 0x1F68, 0x0342 } },
1619     { 0x1F6F, { 0x1F69, 0x0342 } },
1620     { 0x1F70, { 0x03B1, 0x0300 } },
1621     { 0x1F71, { 0x03AC, 0 } },
1622     { 0x1F72, { 0x03B5, 0x0300 } },
1623     { 0x1F73, { 0x03AD, 0 } },
1624     { 0x1F74, { 0x03B7, 0x0300 } },
1625     { 0x1F75, { 0x03AE, 0 } },
1626     { 0x1F76, { 0x03B9, 0x0300 } },
1627     { 0x1F77, { 0x03AF, 0 } },
1628     { 0x1F78, { 0x03BF, 0x0300 } },
1629     { 0x1F79, { 0x03CC, 0 } },
1630     { 0x1F7A, { 0x03C5, 0x0300 } },
1631     { 0x1F7B, { 0x03CD, 0 } },
1632     { 0x1F7C, { 0x03C9, 0x0300 } },
1633     { 0x1F7D, { 0x03CE, 0 } },
1634     { 0x1F80, { 0x1F00, 0x0345 } },
1635     { 0x1F81, { 0x1F01, 0x0345 } },
1636     { 0x1F82, { 0x1F02, 0x0345 } },
1637     { 0x1F83, { 0x1F03, 0x0345 } },
1638     { 0x1F84, { 0x1F04, 0x0345 } },
1639     { 0x1F85, { 0x1F05, 0x0345 } },
1640     { 0x1F86, { 0x1F06, 0x0345 } },
1641     { 0x1F87, { 0x1F07, 0x0345 } },
1642     { 0x1F88, { 0x1F08, 0x0345 } },
1643     { 0x1F89, { 0x1F09, 0x0345 } },
1644     { 0x1F8A, { 0x1F0A, 0x0345 } },
1645     { 0x1F8B, { 0x1F0B, 0x0345 } },
1646     { 0x1F8C, { 0x1F0C, 0x0345 } },
1647     { 0x1F8D, { 0x1F0D, 0x0345 } },
1648     { 0x1F8E, { 0x1F0E, 0x0345 } },
1649     { 0x1F8F, { 0x1F0F, 0x0345 } },
1650     { 0x1F90, { 0x1F20, 0x0345 } },
1651     { 0x1F91, { 0x1F21, 0x0345 } },
1652     { 0x1F92, { 0x1F22, 0x0345 } },
1653     { 0x1F93, { 0x1F23, 0x0345 } },
1654     { 0x1F94, { 0x1F24, 0x0345 } },
1655     { 0x1F95, { 0x1F25, 0x0345 } },
1656     { 0x1F96, { 0x1F26, 0x0345 } },
1657     { 0x1F97, { 0x1F27, 0x0345 } },
1658     { 0x1F98, { 0x1F28, 0x0345 } },
1659     { 0x1F99, { 0x1F29, 0x0345 } },
1660     { 0x1F9A, { 0x1F2A, 0x0345 } },
1661     { 0x1F9B, { 0x1F2B, 0x0345 } },
1662     { 0x1F9C, { 0x1F2C, 0x0345 } },
1663     { 0x1F9D, { 0x1F2D, 0x0345 } },
1664     { 0x1F9E, { 0x1F2E, 0x0345 } },
1665     { 0x1F9F, { 0x1F2F, 0x0345 } },
1666     { 0x1FA0, { 0x1F60, 0x0345 } },
1667     { 0x1FA1, { 0x1F61, 0x0345 } },
1668     { 0x1FA2, { 0x1F62, 0x0345 } },
1669     { 0x1FA3, { 0x1F63, 0x0345 } },
1670     { 0x1FA4, { 0x1F64, 0x0345 } },
1671     { 0x1FA5, { 0x1F65, 0x0345 } },
1672     { 0x1FA6, { 0x1F66, 0x0345 } },
1673     { 0x1FA7, { 0x1F67, 0x0345 } },
1674     { 0x1FA8, { 0x1F68, 0x0345 } },
1675     { 0x1FA9, { 0x1F69, 0x0345 } },
1676     { 0x1FAA, { 0x1F6A, 0x0345 } },
1677     { 0x1FAB, { 0x1F6B, 0x0345 } },
1678     { 0x1FAC, { 0x1F6C, 0x0345 } },
1679     { 0x1FAD, { 0x1F6D, 0x0345 } },
1680     { 0x1FAE, { 0x1F6E, 0x0345 } },
1681     { 0x1FAF, { 0x1F6F, 0x0345 } },
1682     { 0x1FB0, { 0x03B1, 0x0306 } },
1683     { 0x1FB1, { 0x03B1, 0x0304 } },
1684     { 0x1FB2, { 0x1F70, 0x0345 } },
1685     { 0x1FB3, { 0x03B1, 0x0345 } },
1686     { 0x1FB4, { 0x03AC, 0x0345 } },
1687     { 0x1FB6, { 0x03B1, 0x0342 } },
1688     { 0x1FB7, { 0x1FB6, 0x0345 } },
1689     { 0x1FB8, { 0x0391, 0x0306 } },
1690     { 0x1FB9, { 0x0391, 0x0304 } },
1691     { 0x1FBA, { 0x0391, 0x0300 } },
1692     { 0x1FBB, { 0x0386, 0 } },
1693     { 0x1FBC, { 0x0391, 0x0345 } },
1694     { 0x1FBE, { 0x03B9, 0 } },
1695     { 0x1FC1, { 0x00A8, 0x0342 } },
1696     { 0x1FC2, { 0x1F74, 0x0345 } },
1697     { 0x1FC3, { 0x03B7, 0x0345 } },
1698     { 0x1FC4, { 0x03AE, 0x0345 } },
1699     { 0x1FC6, { 0x03B7, 0x0342 } },
1700     { 0x1FC7, { 0x1FC6, 0x0345 } },
1701     { 0x1FC8, { 0x0395, 0x0300 } },
1702     { 0x1FC9, { 0x0388, 0 } },
1703     { 0x1FCA, { 0x0397, 0x0300 } },
1704     { 0x1FCB, { 0x0389, 0 } },
1705     { 0x1FCC, { 0x0397, 0x0345 } },
1706     { 0x1FCD, { 0x1FBF, 0x0300 } },
1707     { 0x1FCE, { 0x1FBF, 0x0301 } },
1708     { 0x1FCF, { 0x1FBF, 0x0342 } },
1709     { 0x1FD0, { 0x03B9, 0x0306 } },
1710     { 0x1FD1, { 0x03B9, 0x0304 } },
1711     { 0x1FD2, { 0x03CA, 0x0300 } },
1712     { 0x1FD3, { 0x0390, 0 } },
1713     { 0x1FD6, { 0x03B9, 0x0342 } },
1714     { 0x1FD7, { 0x03CA, 0x0342 } },
1715     { 0x1FD8, { 0x0399, 0x0306 } },
1716     { 0x1FD9, { 0x0399, 0x0304 } },
1717     { 0x1FDA, { 0x0399, 0x0300 } },
1718     { 0x1FDB, { 0x038A, 0 } },
1719     { 0x1FDD, { 0x1FFE, 0x0300 } },
1720     { 0x1FDE, { 0x1FFE, 0x0301 } },
1721     { 0x1FDF, { 0x1FFE, 0x0342 } },
1722     { 0x1FE0, { 0x03C5, 0x0306 } },
1723     { 0x1FE1, { 0x03C5, 0x0304 } },
1724     { 0x1FE2, { 0x03CB, 0x0300 } },
1725     { 0x1FE3, { 0x03B0, 0 } },
1726     { 0x1FE4, { 0x03C1, 0x0313 } },
1727     { 0x1FE5, { 0x03C1, 0x0314 } },
1728     { 0x1FE6, { 0x03C5, 0x0342 } },
1729     { 0x1FE7, { 0x03CB, 0x0342 } },
1730     { 0x1FE8, { 0x03A5, 0x0306 } },
1731     { 0x1FE9, { 0x03A5, 0x0304 } },
1732     { 0x1FEA, { 0x03A5, 0x0300 } },
1733     { 0x1FEB, { 0x038E, 0 } },
1734     { 0x1FEC, { 0x03A1, 0x0314 } },
1735     { 0x1FED, { 0x00A8, 0x0300 } },
1736     { 0x1FEE, { 0x0385, 0 } },
1737     { 0x1FEF, { 0x0060, 0 } },
1738     { 0x1FF2, { 0x1F7C, 0x0345 } },
1739     { 0x1FF3, { 0x03C9, 0x0345 } },
1740     { 0x1FF4, { 0x03CE, 0x0345 } },
1741     { 0x1FF6, { 0x03C9, 0x0342 } },
1742     { 0x1FF7, { 0x1FF6, 0x0345 } },
1743     { 0x1FF8, { 0x039F, 0x0300 } },
1744     { 0x1FF9, { 0x038C, 0 } },
1745     { 0x1FFA, { 0x03A9, 0x0300 } },
1746     { 0x1FFB, { 0x038F, 0 } },
1747     { 0x1FFC, { 0x03A9, 0x0345 } },
1748     { 0x1FFD, { 0x00B4, 0 } },
1749     { 0x2000, { 0x2002, 0 } },
1750     { 0x2001, { 0x2003, 0 } },
1751     { 0x2126, { 0x03A9, 0 } },
1752     { 0x212A, { 0x004B, 0 } },
1753     { 0x212B, { 0x00C5, 0 } },
1754     { 0x219A, { 0x2190, 0x0338 } },
1755     { 0x219B, { 0x2192, 0x0338 } },
1756     { 0x21AE, { 0x2194, 0x0338 } },
1757     { 0x21CD, { 0x21D0, 0x0338 } },
1758     { 0x21CE, { 0x21D4, 0x0338 } },
1759     { 0x21CF, { 0x21D2, 0x0338 } },
1760     { 0x2204, { 0x2203, 0x0338 } },
1761     { 0x2209, { 0x2208, 0x0338 } },
1762     { 0x220C, { 0x220B, 0x0338 } },
1763     { 0x2224, { 0x2223, 0x0338 } },
1764     { 0x2226, { 0x2225, 0x0338 } },
1765     { 0x2241, { 0x223C, 0x0338 } },
1766     { 0x2244, { 0x2243, 0x0338 } },
1767     { 0x2247, { 0x2245, 0x0338 } },
1768     { 0x2249, { 0x2248, 0x0338 } },
1769     { 0x2260, { 0x003D, 0x0338 } },
1770     { 0x2262, { 0x2261, 0x0338 } },
1771     { 0x226D, { 0x224D, 0x0338 } },
1772     { 0x226E, { 0x003C, 0x0338 } },
1773     { 0x226F, { 0x003E, 0x0338 } },
1774     { 0x2270, { 0x2264, 0x0338 } },
1775     { 0x2271, { 0x2265, 0x0338 } },
1776     { 0x2274, { 0x2272, 0x0338 } },
1777     { 0x2275, { 0x2273, 0x0338 } },
1778     { 0x2278, { 0x2276, 0x0338 } },
1779     { 0x2279, { 0x2277, 0x0338 } },
1780     { 0x2280, { 0x227A, 0x0338 } },
1781     { 0x2281, { 0x227B, 0x0338 } },
1782     { 0x2284, { 0x2282, 0x0338 } },
1783     { 0x2285, { 0x2283, 0x0338 } },
1784     { 0x2288, { 0x2286, 0x0338 } },
1785     { 0x2289, { 0x2287, 0x0338 } },
1786     { 0x22AC, { 0x22A2, 0x0338 } },
1787     { 0x22AD, { 0x22A8, 0x0338 } },
1788     { 0x22AE, { 0x22A9, 0x0338 } },
1789     { 0x22AF, { 0x22AB, 0x0338 } },
1790     { 0x22E0, { 0x227C, 0x0338 } },
1791     { 0x22E1, { 0x227D, 0x0338 } },
1792     { 0x22E2, { 0x2291, 0x0338 } },
1793     { 0x22E3, { 0x2292, 0x0338 } },
1794     { 0x22EA, { 0x22B2, 0x0338 } },
1795     { 0x22EB, { 0x22B3, 0x0338 } },
1796     { 0x22EC, { 0x22B4, 0x0338 } },
1797     { 0x22ED, { 0x22B5, 0x0338 } },
1798     { 0x2329, { 0x3008, 0 } },
1799     { 0x232A, { 0x3009, 0 } },
1800     { 0x2ADC, { 0x2ADD, 0x0338 } },
1801     { 0x304C, { 0x304B, 0x3099 } },
1802     { 0x304E, { 0x304D, 0x3099 } },
1803     { 0x3050, { 0x304F, 0x3099 } },
1804     { 0x3052, { 0x3051, 0x3099 } },
1805     { 0x3054, { 0x3053, 0x3099 } },
1806     { 0x3056, { 0x3055, 0x3099 } },
1807     { 0x3058, { 0x3057, 0x3099 } },
1808     { 0x305A, { 0x3059, 0x3099 } },
1809     { 0x305C, { 0x305B, 0x3099 } },
1810     { 0x305E, { 0x305D, 0x3099 } },
1811     { 0x3060, { 0x305F, 0x3099 } },
1812     { 0x3062, { 0x3061, 0x3099 } },
1813     { 0x3065, { 0x3064, 0x3099 } },
1814     { 0x3067, { 0x3066, 0x3099 } },
1815     { 0x3069, { 0x3068, 0x3099 } },
1816     { 0x3070, { 0x306F, 0x3099 } },
1817     { 0x3071, { 0x306F, 0x309A } },
1818     { 0x3073, { 0x3072, 0x3099 } },
1819     { 0x3074, { 0x3072, 0x309A } },
1820     { 0x3076, { 0x3075, 0x3099 } },
1821     { 0x3077, { 0x3075, 0x309A } },
1822     { 0x3079, { 0x3078, 0x3099 } },
1823     { 0x307A, { 0x3078, 0x309A } },
1824     { 0x307C, { 0x307B, 0x3099 } },
1825     { 0x307D, { 0x307B, 0x309A } },
1826     { 0x3094, { 0x3046, 0x3099 } },
1827     { 0x309E, { 0x309D, 0x3099 } },
1828     { 0x30AC, { 0x30AB, 0x3099 } },
1829     { 0x30AE, { 0x30AD, 0x3099 } },
1830     { 0x30B0, { 0x30AF, 0x3099 } },
1831     { 0x30B2, { 0x30B1, 0x3099 } },
1832     { 0x30B4, { 0x30B3, 0x3099 } },
1833     { 0x30B6, { 0x30B5, 0x3099 } },
1834     { 0x30B8, { 0x30B7, 0x3099 } },
1835     { 0x30BA, { 0x30B9, 0x3099 } },
1836     { 0x30BC, { 0x30BB, 0x3099 } },
1837     { 0x30BE, { 0x30BD, 0x3099 } },
1838     { 0x30C0, { 0x30BF, 0x3099 } },
1839     { 0x30C2, { 0x30C1, 0x3099 } },
1840     { 0x30C5, { 0x30C4, 0x3099 } },
1841     { 0x30C7, { 0x30C6, 0x3099 } },
1842     { 0x30C9, { 0x30C8, 0x3099 } },
1843     { 0x30D0, { 0x30CF, 0x3099 } },
1844     { 0x30D1, { 0x30CF, 0x309A } },
1845     { 0x30D3, { 0x30D2, 0x3099 } },
1846     { 0x30D4, { 0x30D2, 0x309A } },
1847     { 0x30D6, { 0x30D5, 0x3099 } },
1848     { 0x30D7, { 0x30D5, 0x309A } },
1849     { 0x30D9, { 0x30D8, 0x3099 } },
1850     { 0x30DA, { 0x30D8, 0x309A } },
1851     { 0x30DC, { 0x30DB, 0x3099 } },
1852     { 0x30DD, { 0x30DB, 0x309A } },
1853     { 0x30F4, { 0x30A6, 0x3099 } },
1854     { 0x30F7, { 0x30EF, 0x3099 } },
1855     { 0x30F8, { 0x30F0, 0x3099 } },
1856     { 0x30F9, { 0x30F1, 0x3099 } },
1857     { 0x30FA, { 0x30F2, 0x3099 } },
1858     { 0x30FE, { 0x30FD, 0x3099 } },
1859     { 0xF900, { 0x8C48, 0 } },
1860     { 0xF901, { 0x66F4, 0 } },
1861     { 0xF902, { 0x8ECA, 0 } },
1862     { 0xF903, { 0x8CC8, 0 } },
1863     { 0xF904, { 0x6ED1, 0 } },
1864     { 0xF905, { 0x4E32, 0 } },
1865     { 0xF906, { 0x53E5, 0 } },
1866     { 0xF907, { 0x9F9C, 0 } },
1867     { 0xF908, { 0x9F9C, 0 } },
1868     { 0xF909, { 0x5951, 0 } },
1869     { 0xF90A, { 0x91D1, 0 } },
1870     { 0xF90B, { 0x5587, 0 } },
1871     { 0xF90C, { 0x5948, 0 } },
1872     { 0xF90D, { 0x61F6, 0 } },
1873     { 0xF90E, { 0x7669, 0 } },
1874     { 0xF90F, { 0x7F85, 0 } },
1875     { 0xF910, { 0x863F, 0 } },
1876     { 0xF911, { 0x87BA, 0 } },
1877     { 0xF912, { 0x88F8, 0 } },
1878     { 0xF913, { 0x908F, 0 } },
1879     { 0xF914, { 0x6A02, 0 } },
1880     { 0xF915, { 0x6D1B, 0 } },
1881     { 0xF916, { 0x70D9, 0 } },
1882     { 0xF917, { 0x73DE, 0 } },
1883     { 0xF918, { 0x843D, 0 } },
1884     { 0xF919, { 0x916A, 0 } },
1885     { 0xF91A, { 0x99F1, 0 } },
1886     { 0xF91B, { 0x4E82, 0 } },
1887     { 0xF91C, { 0x5375, 0 } },
1888     { 0xF91D, { 0x6B04, 0 } },
1889     { 0xF91E, { 0x721B, 0 } },
1890     { 0xF91F, { 0x862D, 0 } },
1891     { 0xF920, { 0x9E1E, 0 } },
1892     { 0xF921, { 0x5D50, 0 } },
1893     { 0xF922, { 0x6FEB, 0 } },
1894     { 0xF923, { 0x85CD, 0 } },
1895     { 0xF924, { 0x8964, 0 } },
1896     { 0xF925, { 0x62C9, 0 } },
1897     { 0xF926, { 0x81D8, 0 } },
1898     { 0xF927, { 0x881F, 0 } },
1899     { 0xF928, { 0x5ECA, 0 } },
1900     { 0xF929, { 0x6717, 0 } },
1901     { 0xF92A, { 0x6D6A, 0 } },
1902     { 0xF92B, { 0x72FC, 0 } },
1903     { 0xF92C, { 0x90CE, 0 } },
1904     { 0xF92D, { 0x4F86, 0 } },
1905     { 0xF92E, { 0x51B7, 0 } },
1906     { 0xF92F, { 0x52DE, 0 } },
1907     { 0xF930, { 0x64C4, 0 } },
1908     { 0xF931, { 0x6AD3, 0 } },
1909     { 0xF932, { 0x7210, 0 } },
1910     { 0xF933, { 0x76E7, 0 } },
1911     { 0xF934, { 0x8001, 0 } },
1912     { 0xF935, { 0x8606, 0 } },
1913     { 0xF936, { 0x865C, 0 } },
1914     { 0xF937, { 0x8DEF, 0 } },
1915     { 0xF938, { 0x9732, 0 } },
1916     { 0xF939, { 0x9B6F, 0 } },
1917     { 0xF93A, { 0x9DFA, 0 } },
1918     { 0xF93B, { 0x788C, 0 } },
1919     { 0xF93C, { 0x797F, 0 } },
1920     { 0xF93D, { 0x7DA0, 0 } },
1921     { 0xF93E, { 0x83C9, 0 } },
1922     { 0xF93F, { 0x9304, 0 } },
1923     { 0xF940, { 0x9E7F, 0 } },
1924     { 0xF941, { 0x8AD6, 0 } },
1925     { 0xF942, { 0x58DF, 0 } },
1926     { 0xF943, { 0x5F04, 0 } },
1927     { 0xF944, { 0x7C60, 0 } },
1928     { 0xF945, { 0x807E, 0 } },
1929     { 0xF946, { 0x7262, 0 } },
1930     { 0xF947, { 0x78CA, 0 } },
1931     { 0xF948, { 0x8CC2, 0 } },
1932     { 0xF949, { 0x96F7, 0 } },
1933     { 0xF94A, { 0x58D8, 0 } },
1934     { 0xF94B, { 0x5C62, 0 } },
1935     { 0xF94C, { 0x6A13, 0 } },
1936     { 0xF94D, { 0x6DDA, 0 } },
1937     { 0xF94E, { 0x6F0F, 0 } },
1938     { 0xF94F, { 0x7D2F, 0 } },
1939     { 0xF950, { 0x7E37, 0 } },
1940     { 0xF951, { 0x964B, 0 } },
1941     { 0xF952, { 0x52D2, 0 } },
1942     { 0xF953, { 0x808B, 0 } },
1943     { 0xF954, { 0x51DC, 0 } },
1944     { 0xF955, { 0x51CC, 0 } },
1945     { 0xF956, { 0x7A1C, 0 } },
1946     { 0xF957, { 0x7DBE, 0 } },
1947     { 0xF958, { 0x83F1, 0 } },
1948     { 0xF959, { 0x9675, 0 } },
1949     { 0xF95A, { 0x8B80, 0 } },
1950     { 0xF95B, { 0x62CF, 0 } },
1951     { 0xF95C, { 0x6A02, 0 } },
1952     { 0xF95D, { 0x8AFE, 0 } },
1953     { 0xF95E, { 0x4E39, 0 } },
1954     { 0xF95F, { 0x5BE7, 0 } },
1955     { 0xF960, { 0x6012, 0 } },
1956     { 0xF961, { 0x7387, 0 } },
1957     { 0xF962, { 0x7570, 0 } },
1958     { 0xF963, { 0x5317, 0 } },
1959     { 0xF964, { 0x78FB, 0 } },
1960     { 0xF965, { 0x4FBF, 0 } },
1961     { 0xF966, { 0x5FA9, 0 } },
1962     { 0xF967, { 0x4E0D, 0 } },
1963     { 0xF968, { 0x6CCC, 0 } },
1964     { 0xF969, { 0x6578, 0 } },
1965     { 0xF96A, { 0x7D22, 0 } },
1966     { 0xF96B, { 0x53C3, 0 } },
1967     { 0xF96C, { 0x585E, 0 } },
1968     { 0xF96D, { 0x7701, 0 } },
1969     { 0xF96E, { 0x8449, 0 } },
1970     { 0xF96F, { 0x8AAA, 0 } },
1971     { 0xF970, { 0x6BBA, 0 } },
1972     { 0xF971, { 0x8FB0, 0 } },
1973     { 0xF972, { 0x6C88, 0 } },
1974     { 0xF973, { 0x62FE, 0 } },
1975     { 0xF974, { 0x82E5, 0 } },
1976     { 0xF975, { 0x63A0, 0 } },
1977     { 0xF976, { 0x7565, 0 } },
1978     { 0xF977, { 0x4EAE, 0 } },
1979     { 0xF978, { 0x5169, 0 } },
1980     { 0xF979, { 0x51C9, 0 } },
1981     { 0xF97A, { 0x6881, 0 } },
1982     { 0xF97B, { 0x7CE7, 0 } },
1983     { 0xF97C, { 0x826F, 0 } },
1984     { 0xF97D, { 0x8AD2, 0 } },
1985     { 0xF97E, { 0x91CF, 0 } },
1986     { 0xF97F, { 0x52F5, 0 } },
1987     { 0xF980, { 0x5442, 0 } },
1988     { 0xF981, { 0x5973, 0 } },
1989     { 0xF982, { 0x5EEC, 0 } },
1990     { 0xF983, { 0x65C5, 0 } },
1991     { 0xF984, { 0x6FFE, 0 } },
1992     { 0xF985, { 0x792A, 0 } },
1993     { 0xF986, { 0x95AD, 0 } },
1994     { 0xF987, { 0x9A6A, 0 } },
1995     { 0xF988, { 0x9E97, 0 } },
1996     { 0xF989, { 0x9ECE, 0 } },
1997     { 0xF98A, { 0x529B, 0 } },
1998     { 0xF98B, { 0x66C6, 0 } },
1999     { 0xF98C, { 0x6B77, 0 } },
2000     { 0xF98D, { 0x8F62, 0 } },
2001     { 0xF98E, { 0x5E74, 0 } },
2002     { 0xF98F, { 0x6190, 0 } },
2003     { 0xF990, { 0x6200, 0 } },
2004     { 0xF991, { 0x649A, 0 } },
2005     { 0xF992, { 0x6F23, 0 } },
2006     { 0xF993, { 0x7149, 0 } },
2007     { 0xF994, { 0x7489, 0 } },
2008     { 0xF995, { 0x79CA, 0 } },
2009     { 0xF996, { 0x7DF4, 0 } },
2010     { 0xF997, { 0x806F, 0 } },
2011     { 0xF998, { 0x8F26, 0 } },
2012     { 0xF999, { 0x84EE, 0 } },
2013     { 0xF99A, { 0x9023, 0 } },
2014     { 0xF99B, { 0x934A, 0 } },
2015     { 0xF99C, { 0x5217, 0 } },
2016     { 0xF99D, { 0x52A3, 0 } },
2017     { 0xF99E, { 0x54BD, 0 } },
2018     { 0xF99F, { 0x70C8, 0 } },
2019     { 0xF9A0, { 0x88C2, 0 } },
2020     { 0xF9A1, { 0x8AAA, 0 } },
2021     { 0xF9A2, { 0x5EC9, 0 } },
2022     { 0xF9A3, { 0x5FF5, 0 } },
2023     { 0xF9A4, { 0x637B, 0 } },
2024     { 0xF9A5, { 0x6BAE, 0 } },
2025     { 0xF9A6, { 0x7C3E, 0 } },
2026     { 0xF9A7, { 0x7375, 0 } },
2027     { 0xF9A8, { 0x4EE4, 0 } },
2028     { 0xF9A9, { 0x56F9, 0 } },
2029     { 0xF9AA, { 0x5BE7, 0 } },
2030     { 0xF9AB, { 0x5DBA, 0 } },
2031     { 0xF9AC, { 0x601C, 0 } },
2032     { 0xF9AD, { 0x73B2, 0 } },
2033     { 0xF9AE, { 0x7469, 0 } },
2034     { 0xF9AF, { 0x7F9A, 0 } },
2035     { 0xF9B0, { 0x8046, 0 } },
2036     { 0xF9B1, { 0x9234, 0 } },
2037     { 0xF9B2, { 0x96F6, 0 } },
2038     { 0xF9B3, { 0x9748, 0 } },
2039     { 0xF9B4, { 0x9818, 0 } },
2040     { 0xF9B5, { 0x4F8B, 0 } },
2041     { 0xF9B6, { 0x79AE, 0 } },
2042     { 0xF9B7, { 0x91B4, 0 } },
2043     { 0xF9B8, { 0x96B8, 0 } },
2044     { 0xF9B9, { 0x60E1, 0 } },
2045     { 0xF9BA, { 0x4E86, 0 } },
2046     { 0xF9BB, { 0x50DA, 0 } },
2047     { 0xF9BC, { 0x5BEE, 0 } },
2048     { 0xF9BD, { 0x5C3F, 0 } },
2049     { 0xF9BE, { 0x6599, 0 } },
2050     { 0xF9BF, { 0x6A02, 0 } },
2051     { 0xF9C0, { 0x71CE, 0 } },
2052     { 0xF9C1, { 0x7642, 0 } },
2053     { 0xF9C2, { 0x84FC, 0 } },
2054     { 0xF9C3, { 0x907C, 0 } },
2055     { 0xF9C4, { 0x9F8D, 0 } },
2056     { 0xF9C5, { 0x6688, 0 } },
2057     { 0xF9C6, { 0x962E, 0 } },
2058     { 0xF9C7, { 0x5289, 0 } },
2059     { 0xF9C8, { 0x677B, 0 } },
2060     { 0xF9C9, { 0x67F3, 0 } },
2061     { 0xF9CA, { 0x6D41, 0 } },
2062     { 0xF9CB, { 0x6E9C, 0 } },
2063     { 0xF9CC, { 0x7409, 0 } },
2064     { 0xF9CD, { 0x7559, 0 } },
2065     { 0xF9CE, { 0x786B, 0 } },
2066     { 0xF9CF, { 0x7D10, 0 } },
2067     { 0xF9D0, { 0x985E, 0 } },
2068     { 0xF9D1, { 0x516D, 0 } },
2069     { 0xF9D2, { 0x622E, 0 } },
2070     { 0xF9D3, { 0x9678, 0 } },
2071     { 0xF9D4, { 0x502B, 0 } },
2072     { 0xF9D5, { 0x5D19, 0 } },
2073     { 0xF9D6, { 0x6DEA, 0 } },
2074     { 0xF9D7, { 0x8F2A, 0 } },
2075     { 0xF9D8, { 0x5F8B, 0 } },
2076     { 0xF9D9, { 0x6144, 0 } },
2077     { 0xF9DA, { 0x6817, 0 } },
2078     { 0xF9DB, { 0x7387, 0 } },
2079     { 0xF9DC, { 0x9686, 0 } },
2080     { 0xF9DD, { 0x5229, 0 } },
2081     { 0xF9DE, { 0x540F, 0 } },
2082     { 0xF9DF, { 0x5C65, 0 } },
2083     { 0xF9E0, { 0x6613, 0 } },
2084     { 0xF9E1, { 0x674E, 0 } },
2085     { 0xF9E2, { 0x68A8, 0 } },
2086     { 0xF9E3, { 0x6CE5, 0 } },
2087     { 0xF9E4, { 0x7406, 0 } },
2088     { 0xF9E5, { 0x75E2, 0 } },
2089     { 0xF9E6, { 0x7F79, 0 } },
2090     { 0xF9E7, { 0x88CF, 0 } },
2091     { 0xF9E8, { 0x88E1, 0 } },
2092     { 0xF9E9, { 0x91CC, 0 } },
2093     { 0xF9EA, { 0x96E2, 0 } },
2094     { 0xF9EB, { 0x533F, 0 } },
2095     { 0xF9EC, { 0x6EBA, 0 } },
2096     { 0xF9ED, { 0x541D, 0 } },
2097     { 0xF9EE, { 0x71D0, 0 } },
2098     { 0xF9EF, { 0x7498, 0 } },
2099     { 0xF9F0, { 0x85FA, 0 } },
2100     { 0xF9F1, { 0x96A3, 0 } },
2101     { 0xF9F2, { 0x9C57, 0 } },
2102     { 0xF9F3, { 0x9E9F, 0 } },
2103     { 0xF9F4, { 0x6797, 0 } },
2104     { 0xF9F5, { 0x6DCB, 0 } },
2105     { 0xF9F6, { 0x81E8, 0 } },
2106     { 0xF9F7, { 0x7ACB, 0 } },
2107     { 0xF9F8, { 0x7B20, 0 } },
2108     { 0xF9F9, { 0x7C92, 0 } },
2109     { 0xF9FA, { 0x72C0, 0 } },
2110     { 0xF9FB, { 0x7099, 0 } },
2111     { 0xF9FC, { 0x8B58, 0 } },
2112     { 0xF9FD, { 0x4EC0, 0 } },
2113     { 0xF9FE, { 0x8336, 0 } },
2114     { 0xF9FF, { 0x523A, 0 } },
2115     { 0xFA00, { 0x5207, 0 } },
2116     { 0xFA01, { 0x5EA6, 0 } },
2117     { 0xFA02, { 0x62D3, 0 } },
2118     { 0xFA03, { 0x7CD6, 0 } },
2119     { 0xFA04, { 0x5B85, 0 } },
2120     { 0xFA05, { 0x6D1E, 0 } },
2121     { 0xFA06, { 0x66B4, 0 } },
2122     { 0xFA07, { 0x8F3B, 0 } },
2123     { 0xFA08, { 0x884C, 0 } },
2124     { 0xFA09, { 0x964D, 0 } },
2125     { 0xFA0A, { 0x898B, 0 } },
2126     { 0xFA0B, { 0x5ED3, 0 } },
2127     { 0xFA0C, { 0x5140, 0 } },
2128     { 0xFA0D, { 0x55C0, 0 } },
2129     { 0xFA10, { 0x585A, 0 } },
2130     { 0xFA12, { 0x6674, 0 } },
2131     { 0xFA15, { 0x51DE, 0 } },
2132     { 0xFA16, { 0x732A, 0 } },
2133     { 0xFA17, { 0x76CA, 0 } },
2134     { 0xFA18, { 0x793C, 0 } },
2135     { 0xFA19, { 0x795E, 0 } },
2136     { 0xFA1A, { 0x7965, 0 } },
2137     { 0xFA1B, { 0x798F, 0 } },
2138     { 0xFA1C, { 0x9756, 0 } },
2139     { 0xFA1D, { 0x7CBE, 0 } },
2140     { 0xFA1E, { 0x7FBD, 0 } },
2141     { 0xFA20, { 0x8612, 0 } },
2142     { 0xFA22, { 0x8AF8, 0 } },
2143     { 0xFA25, { 0x9038, 0 } },
2144     { 0xFA26, { 0x90FD, 0 } },
2145     { 0xFA2A, { 0x98EF, 0 } },
2146     { 0xFA2B, { 0x98FC, 0 } },
2147     { 0xFA2C, { 0x9928, 0 } },
2148     { 0xFA2D, { 0x9DB4, 0 } },
2149     { 0xFA2E, { 0x90DE, 0 } },
2150     { 0xFA2F, { 0x96B7, 0 } },
2151     { 0xFA30, { 0x4FAE, 0 } },
2152     { 0xFA31, { 0x50E7, 0 } },
2153     { 0xFA32, { 0x514D, 0 } },
2154     { 0xFA33, { 0x52C9, 0 } },
2155     { 0xFA34, { 0x52E4, 0 } },
2156     { 0xFA35, { 0x5351, 0 } },
2157     { 0xFA36, { 0x559D, 0 } },
2158     { 0xFA37, { 0x5606, 0 } },
2159     { 0xFA38, { 0x5668, 0 } },
2160     { 0xFA39, { 0x5840, 0 } },
2161     { 0xFA3A, { 0x58A8, 0 } },
2162     { 0xFA3B, { 0x5C64, 0 } },
2163     { 0xFA3C, { 0x5C6E, 0 } },
2164     { 0xFA3D, { 0x6094, 0 } },
2165     { 0xFA3E, { 0x6168, 0 } },
2166     { 0xFA3F, { 0x618E, 0 } },
2167     { 0xFA40, { 0x61F2, 0 } },
2168     { 0xFA41, { 0x654F, 0 } },
2169     { 0xFA42, { 0x65E2, 0 } },
2170     { 0xFA43, { 0x6691, 0 } },
2171     { 0xFA44, { 0x6885, 0 } },
2172     { 0xFA45, { 0x6D77, 0 } },
2173     { 0xFA46, { 0x6E1A, 0 } },
2174     { 0xFA47, { 0x6F22, 0 } },
2175     { 0xFA48, { 0x716E, 0 } },
2176     { 0xFA49, { 0x722B, 0 } },
2177     { 0xFA4A, { 0x7422, 0 } },
2178     { 0xFA4B, { 0x7891, 0 } },
2179     { 0xFA4C, { 0x793E, 0 } },
2180     { 0xFA4D, { 0x7949, 0 } },
2181     { 0xFA4E, { 0x7948, 0 } },
2182     { 0xFA4F, { 0x7950, 0 } },
2183     { 0xFA50, { 0x7956, 0 } },
2184     { 0xFA51, { 0x795D, 0 } },
2185     { 0xFA52, { 0x798D, 0 } },
2186     { 0xFA53, { 0x798E, 0 } },
2187     { 0xFA54, { 0x7A40, 0 } },
2188     { 0xFA55, { 0x7A81, 0 } },
2189     { 0xFA56, { 0x7BC0, 0 } },
2190     { 0xFA57, { 0x7DF4, 0 } },
2191     { 0xFA58, { 0x7E09, 0 } },
2192     { 0xFA59, { 0x7E41, 0 } },
2193     { 0xFA5A, { 0x7F72, 0 } },
2194     { 0xFA5B, { 0x8005, 0 } },
2195     { 0xFA5C, { 0x81ED, 0 } },
2196     { 0xFA5D, { 0x8279, 0 } },
2197     { 0xFA5E, { 0x8279, 0 } },
2198     { 0xFA5F, { 0x8457, 0 } },
2199     { 0xFA60, { 0x8910, 0 } },
2200     { 0xFA61, { 0x8996, 0 } },
2201     { 0xFA62, { 0x8B01, 0 } },
2202     { 0xFA63, { 0x8B39, 0 } },
2203     { 0xFA64, { 0x8CD3, 0 } },
2204     { 0xFA65, { 0x8D08, 0 } },
2205     { 0xFA66, { 0x8FB6, 0 } },
2206     { 0xFA67, { 0x9038, 0 } },
2207     { 0xFA68, { 0x96E3, 0 } },
2208     { 0xFA69, { 0x97FF, 0 } },
2209     { 0xFA6A, { 0x983B, 0 } },
2210     { 0xFA6B, { 0x6075, 0 } },
2211     { 0xFA6C, { 0x242EE, 0 } },
2212     { 0xFA6D, { 0x8218, 0 } },
2213     { 0xFA70, { 0x4E26, 0 } },
2214     { 0xFA71, { 0x51B5, 0 } },
2215     { 0xFA72, { 0x5168, 0 } },
2216     { 0xFA73, { 0x4F80, 0 } },
2217     { 0xFA74, { 0x5145, 0 } },
2218     { 0xFA75, { 0x5180, 0 } },
2219     { 0xFA76, { 0x52C7, 0 } },
2220     { 0xFA77, { 0x52FA, 0 } },
2221     { 0xFA78, { 0x559D, 0 } },
2222     { 0xFA79, { 0x5555, 0 } },
2223     { 0xFA7A, { 0x5599, 0 } },
2224     { 0xFA7B, { 0x55E2, 0 } },
2225     { 0xFA7C, { 0x585A, 0 } },
2226     { 0xFA7D, { 0x58B3, 0 } },
2227     { 0xFA7E, { 0x5944, 0 } },
2228     { 0xFA7F, { 0x5954, 0 } },
2229     { 0xFA80, { 0x5A62, 0 } },
2230     { 0xFA81, { 0x5B28, 0 } },
2231     { 0xFA82, { 0x5ED2, 0 } },
2232     { 0xFA83, { 0x5ED9, 0 } },
2233     { 0xFA84, { 0x5F69, 0 } },
2234     { 0xFA85, { 0x5FAD, 0 } },
2235     { 0xFA86, { 0x60D8, 0 } },
2236     { 0xFA87, { 0x614E, 0 } },
2237     { 0xFA88, { 0x6108, 0 } },
2238     { 0xFA89, { 0x618E, 0 } },
2239     { 0xFA8A, { 0x6160, 0 } },
2240     { 0xFA8B, { 0x61F2, 0 } },
2241     { 0xFA8C, { 0x6234, 0 } },
2242     { 0xFA8D, { 0x63C4, 0 } },
2243     { 0xFA8E, { 0x641C, 0 } },
2244     { 0xFA8F, { 0x6452, 0 } },
2245     { 0xFA90, { 0x6556, 0 } },
2246     { 0xFA91, { 0x6674, 0 } },
2247     { 0xFA92, { 0x6717, 0 } },
2248     { 0xFA93, { 0x671B, 0 } },
2249     { 0xFA94, { 0x6756, 0 } },
2250     { 0xFA95, { 0x6B79, 0 } },
2251     { 0xFA96, { 0x6BBA, 0 } },
2252     { 0xFA97, { 0x6D41, 0 } },
2253     { 0xFA98, { 0x6EDB, 0 } },
2254     { 0xFA99, { 0x6ECB, 0 } },
2255     { 0xFA9A, { 0x6F22, 0 } },
2256     { 0xFA9B, { 0x701E, 0 } },
2257     { 0xFA9C, { 0x716E, 0 } },
2258     { 0xFA9D, { 0x77A7, 0 } },
2259     { 0xFA9E, { 0x7235, 0 } },
2260     { 0xFA9F, { 0x72AF, 0 } },
2261     { 0xFAA0, { 0x732A, 0 } },
2262     { 0xFAA1, { 0x7471, 0 } },
2263     { 0xFAA2, { 0x7506, 0 } },
2264     { 0xFAA3, { 0x753B, 0 } },
2265     { 0xFAA4, { 0x761D, 0 } },
2266     { 0xFAA5, { 0x761F, 0 } },
2267     { 0xFAA6, { 0x76CA, 0 } },
2268     { 0xFAA7, { 0x76DB, 0 } },
2269     { 0xFAA8, { 0x76F4, 0 } },
2270     { 0xFAA9, { 0x774A, 0 } },
2271     { 0xFAAA, { 0x7740, 0 } },
2272     { 0xFAAB, { 0x78CC, 0 } },
2273     { 0xFAAC, { 0x7AB1, 0 } },
2274     { 0xFAAD, { 0x7BC0, 0 } },
2275     { 0xFAAE, { 0x7C7B, 0 } },
2276     { 0xFAAF, { 0x7D5B, 0 } },
2277     { 0xFAB0, { 0x7DF4, 0 } },
2278     { 0xFAB1, { 0x7F3E, 0 } },
2279     { 0xFAB2, { 0x8005, 0 } },
2280     { 0xFAB3, { 0x8352, 0 } },
2281     { 0xFAB4, { 0x83EF, 0 } },
2282     { 0xFAB5, { 0x8779, 0 } },
2283     { 0xFAB6, { 0x8941, 0 } },
2284     { 0xFAB7, { 0x8986, 0 } },
2285     { 0xFAB8, { 0x8996, 0 } },
2286     { 0xFAB9, { 0x8ABF, 0 } },
2287     { 0xFABA, { 0x8AF8, 0 } },
2288     { 0xFABB, { 0x8ACB, 0 } },
2289     { 0xFABC, { 0x8B01, 0 } },
2290     { 0xFABD, { 0x8AFE, 0 } },
2291     { 0xFABE, { 0x8AED, 0 } },
2292     { 0xFABF, { 0x8B39, 0 } },
2293     { 0xFAC0, { 0x8B8A, 0 } },
2294     { 0xFAC1, { 0x8D08, 0 } },
2295     { 0xFAC2, { 0x8F38, 0 } },
2296     { 0xFAC3, { 0x9072, 0 } },
2297     { 0xFAC4, { 0x9199, 0 } },
2298     { 0xFAC5, { 0x9276, 0 } },
2299     { 0xFAC6, { 0x967C, 0 } },
2300     { 0xFAC7, { 0x96E3, 0 } },
2301     { 0xFAC8, { 0x9756, 0 } },
2302     { 0xFAC9, { 0x97DB, 0 } },
2303     { 0xFACA, { 0x97FF, 0 } },
2304     { 0xFACB, { 0x980B, 0 } },
2305     { 0xFACC, { 0x983B, 0 } },
2306     { 0xFACD, { 0x9B12, 0 } },
2307     { 0xFACE, { 0x9F9C, 0 } },
2308     { 0xFACF, { 0x2284A, 0 } },
2309     { 0xFAD0, { 0x22844, 0 } },
2310     { 0xFAD1, { 0x233D5, 0 } },
2311     { 0xFAD2, { 0x3B9D, 0 } },
2312     { 0xFAD3, { 0x4018, 0 } },
2313     { 0xFAD4, { 0x4039, 0 } },
2314     { 0xFAD5, { 0x25249, 0 } },
2315     { 0xFAD6, { 0x25CD0, 0 } },
2316     { 0xFAD7, { 0x27ED3, 0 } },
2317     { 0xFAD8, { 0x9F43, 0 } },
2318     { 0xFAD9, { 0x9F8E, 0 } },
2319     { 0xFB1D, { 0x05D9, 0x05B4 } },
2320     { 0xFB1F, { 0x05F2, 0x05B7 } },
2321     { 0xFB2A, { 0x05E9, 0x05C1 } },
2322     { 0xFB2B, { 0x05E9, 0x05C2 } },
2323     { 0xFB2C, { 0xFB49, 0x05C1 } },
2324     { 0xFB2D, { 0xFB49, 0x05C2 } },
2325     { 0xFB2E, { 0x05D0, 0x05B7 } },
2326     { 0xFB2F, { 0x05D0, 0x05B8 } },
2327     { 0xFB30, { 0x05D0, 0x05BC } },
2328     { 0xFB31, { 0x05D1, 0x05BC } },
2329     { 0xFB32, { 0x05D2, 0x05BC } },
2330     { 0xFB33, { 0x05D3, 0x05BC } },
2331     { 0xFB34, { 0x05D4, 0x05BC } },
2332     { 0xFB35, { 0x05D5, 0x05BC } },
2333     { 0xFB36, { 0x05D6, 0x05BC } },
2334     { 0xFB38, { 0x05D8, 0x05BC } },
2335     { 0xFB39, { 0x05D9, 0x05BC } },
2336     { 0xFB3A, { 0x05DA, 0x05BC } },
2337     { 0xFB3B, { 0x05DB, 0x05BC } },
2338     { 0xFB3C, { 0x05DC, 0x05BC } },
2339     { 0xFB3E, { 0x05DE, 0x05BC } },
2340     { 0xFB40, { 0x05E0, 0x05BC } },
2341     { 0xFB41, { 0x05E1, 0x05BC } },
2342     { 0xFB43, { 0x05E3, 0x05BC } },
2343     { 0xFB44, { 0x05E4, 0x05BC } },
2344     { 0xFB46, { 0x05E6, 0x05BC } },
2345     { 0xFB47, { 0x05E7, 0x05BC } },
2346     { 0xFB48, { 0x05E8, 0x05BC } },
2347     { 0xFB49, { 0x05E9, 0x05BC } },
2348     { 0xFB4A, { 0x05EA, 0x05BC } },
2349     { 0xFB4B, { 0x05D5, 0x05B9 } },
2350     { 0xFB4C, { 0x05D1, 0x05BF } },
2351     { 0xFB4D, { 0x05DB, 0x05BF } },
2352     { 0xFB4E, { 0x05E4, 0x05BF } },
2353     { 0x1109A, { 0x11099, 0x110BA } },
2354     { 0x1109C, { 0x1109B, 0x110BA } },
2355     { 0x110AB, { 0x110A5, 0x110BA } },
2356     { 0x1112E, { 0x11131, 0x11127 } },
2357     { 0x1112F, { 0x11132, 0x11127 } },
2358     { 0x1134B, { 0x11347, 0x1133E } },
2359     { 0x1134C, { 0x11347, 0x11357 } },
2360     { 0x114BB, { 0x114B9, 0x114BA } },
2361     { 0x114BC, { 0x114B9, 0x114B0 } },
2362     { 0x114BE, { 0x114B9, 0x114BD } },
2363     { 0x115BA, { 0x115B8, 0x115AF } },
2364     { 0x115BB, { 0x115B9, 0x115AF } },
2365     { 0x1D15E, { 0x1D157, 0x1D165 } },
2366     { 0x1D15F, { 0x1D158, 0x1D165 } },
2367     { 0x1D160, { 0x1D15F, 0x1D16E } },
2368     { 0x1D161, { 0x1D15F, 0x1D16F } },
2369     { 0x1D162, { 0x1D15F, 0x1D170 } },
2370     { 0x1D163, { 0x1D15F, 0x1D171 } },
2371     { 0x1D164, { 0x1D15F, 0x1D172 } },
2372     { 0x1D1BB, { 0x1D1B9, 0x1D165 } },
2373     { 0x1D1BC, { 0x1D1BA, 0x1D165 } },
2374     { 0x1D1BD, { 0x1D1BB, 0x1D16E } },
2375     { 0x1D1BE, { 0x1D1BC, 0x1D16E } },
2376     { 0x1D1BF, { 0x1D1BB, 0x1D16F } },
2377     { 0x1D1C0, { 0x1D1BC, 0x1D16F } },
2378     { 0x2F800, { 0x4E3D, 0 } },
2379     { 0x2F801, { 0x4E38, 0 } },
2380     { 0x2F802, { 0x4E41, 0 } },
2381     { 0x2F803, { 0x20122, 0 } },
2382     { 0x2F804, { 0x4F60, 0 } },
2383     { 0x2F805, { 0x4FAE, 0 } },
2384     { 0x2F806, { 0x4FBB, 0 } },
2385     { 0x2F807, { 0x5002, 0 } },
2386     { 0x2F808, { 0x507A, 0 } },
2387     { 0x2F809, { 0x5099, 0 } },
2388     { 0x2F80A, { 0x50E7, 0 } },
2389     { 0x2F80B, { 0x50CF, 0 } },
2390     { 0x2F80C, { 0x349E, 0 } },
2391     { 0x2F80D, { 0x2063A, 0 } },
2392     { 0x2F80E, { 0x514D, 0 } },
2393     { 0x2F80F, { 0x5154, 0 } },
2394     { 0x2F810, { 0x5164, 0 } },
2395     { 0x2F811, { 0x5177, 0 } },
2396     { 0x2F812, { 0x2051C, 0 } },
2397     { 0x2F813, { 0x34B9, 0 } },
2398     { 0x2F814, { 0x5167, 0 } },
2399     { 0x2F815, { 0x518D, 0 } },
2400     { 0x2F816, { 0x2054B, 0 } },
2401     { 0x2F817, { 0x5197, 0 } },
2402     { 0x2F818, { 0x51A4, 0 } },
2403     { 0x2F819, { 0x4ECC, 0 } },
2404     { 0x2F81A, { 0x51AC, 0 } },
2405     { 0x2F81B, { 0x51B5, 0 } },
2406     { 0x2F81C, { 0x291DF, 0 } },
2407     { 0x2F81D, { 0x51F5, 0 } },
2408     { 0x2F81E, { 0x5203, 0 } },
2409     { 0x2F81F, { 0x34DF, 0 } },
2410     { 0x2F820, { 0x523B, 0 } },
2411     { 0x2F821, { 0x5246, 0 } },
2412     { 0x2F822, { 0x5272, 0 } },
2413     { 0x2F823, { 0x5277, 0 } },
2414     { 0x2F824, { 0x3515, 0 } },
2415     { 0x2F825, { 0x52C7, 0 } },
2416     { 0x2F826, { 0x52C9, 0 } },
2417     { 0x2F827, { 0x52E4, 0 } },
2418     { 0x2F828, { 0x52FA, 0 } },
2419     { 0x2F829, { 0x5305, 0 } },
2420     { 0x2F82A, { 0x5306, 0 } },
2421     { 0x2F82B, { 0x5317, 0 } },
2422     { 0x2F82C, { 0x5349, 0 } },
2423     { 0x2F82D, { 0x5351, 0 } },
2424     { 0x2F82E, { 0x535A, 0 } },
2425     { 0x2F82F, { 0x5373, 0 } },
2426     { 0x2F830, { 0x537D, 0 } },
2427     { 0x2F831, { 0x537F, 0 } },
2428     { 0x2F832, { 0x537F, 0 } },
2429     { 0x2F833, { 0x537F, 0 } },
2430     { 0x2F834, { 0x20A2C, 0 } },
2431     { 0x2F835, { 0x7070, 0 } },
2432     { 0x2F836, { 0x53CA, 0 } },
2433     { 0x2F837, { 0x53DF, 0 } },
2434     { 0x2F838, { 0x20B63, 0 } },
2435     { 0x2F839, { 0x53EB, 0 } },
2436     { 0x2F83A, { 0x53F1, 0 } },
2437     { 0x2F83B, { 0x5406, 0 } },
2438     { 0x2F83C, { 0x549E, 0 } },
2439     { 0x2F83D, { 0x5438, 0 } },
2440     { 0x2F83E, { 0x5448, 0 } },
2441     { 0x2F83F, { 0x5468, 0 } },
2442     { 0x2F840, { 0x54A2, 0 } },
2443     { 0x2F841, { 0x54F6, 0 } },
2444     { 0x2F842, { 0x5510, 0 } },
2445     { 0x2F843, { 0x5553, 0 } },
2446     { 0x2F844, { 0x5563, 0 } },
2447     { 0x2F845, { 0x5584, 0 } },
2448     { 0x2F846, { 0x5584, 0 } },
2449     { 0x2F847, { 0x5599, 0 } },
2450     { 0x2F848, { 0x55AB, 0 } },
2451     { 0x2F849, { 0x55B3, 0 } },
2452     { 0x2F84A, { 0x55C2, 0 } },
2453     { 0x2F84B, { 0x5716, 0 } },
2454     { 0x2F84C, { 0x5606, 0 } },
2455     { 0x2F84D, { 0x5717, 0 } },
2456     { 0x2F84E, { 0x5651, 0 } },
2457     { 0x2F84F, { 0x5674, 0 } },
2458     { 0x2F850, { 0x5207, 0 } },
2459     { 0x2F851, { 0x58EE, 0 } },
2460     { 0x2F852, { 0x57CE, 0 } },
2461     { 0x2F853, { 0x57F4, 0 } },
2462     { 0x2F854, { 0x580D, 0 } },
2463     { 0x2F855, { 0x578B, 0 } },
2464     { 0x2F856, { 0x5832, 0 } },
2465     { 0x2F857, { 0x5831, 0 } },
2466     { 0x2F858, { 0x58AC, 0 } },
2467     { 0x2F859, { 0x214E4, 0 } },
2468     { 0x2F85A, { 0x58F2, 0 } },
2469     { 0x2F85B, { 0x58F7, 0 } },
2470     { 0x2F85C, { 0x5906, 0 } },
2471     { 0x2F85D, { 0x591A, 0 } },
2472     { 0x2F85E, { 0x5922, 0 } },
2473     { 0x2F85F, { 0x5962, 0 } },
2474     { 0x2F860, { 0x216A8, 0 } },
2475     { 0x2F861, { 0x216EA, 0 } },
2476     { 0x2F862, { 0x59EC, 0 } },
2477     { 0x2F863, { 0x5A1B, 0 } },
2478     { 0x2F864, { 0x5A27, 0 } },
2479     { 0x2F865, { 0x59D8, 0 } },
2480     { 0x2F866, { 0x5A66, 0 } },
2481     { 0x2F867, { 0x36EE, 0 } },
2482     { 0x2F868, { 0x36FC, 0 } },
2483     { 0x2F869, { 0x5B08, 0 } },
2484     { 0x2F86A, { 0x5B3E, 0 } },
2485     { 0x2F86B, { 0x5B3E, 0 } },
2486     { 0x2F86C, { 0x219C8, 0 } },
2487     { 0x2F86D, { 0x5BC3, 0 } },
2488     { 0x2F86E, { 0x5BD8, 0 } },
2489     { 0x2F86F, { 0x5BE7, 0 } },
2490     { 0x2F870, { 0x5BF3, 0 } },
2491     { 0x2F871, { 0x21B18, 0 } },
2492     { 0x2F872, { 0x5BFF, 0 } },
2493     { 0x2F873, { 0x5C06, 0 } },
2494     { 0x2F874, { 0x5F53, 0 } },
2495     { 0x2F875, { 0x5C22, 0 } },
2496     { 0x2F876, { 0x3781, 0 } },
2497     { 0x2F877, { 0x5C60, 0 } },
2498     { 0x2F878, { 0x5C6E, 0 } },
2499     { 0x2F879, { 0x5CC0, 0 } },
2500     { 0x2F87A, { 0x5C8D, 0 } },
2501     { 0x2F87B, { 0x21DE4, 0 } },
2502     { 0x2F87C, { 0x5D43, 0 } },
2503     { 0x2F87D, { 0x21DE6, 0 } },
2504     { 0x2F87E, { 0x5D6E, 0 } },
2505     { 0x2F87F, { 0x5D6B, 0 } },
2506     { 0x2F880, { 0x5D7C, 0 } },
2507     { 0x2F881, { 0x5DE1, 0 } },
2508     { 0x2F882, { 0x5DE2, 0 } },
2509     { 0x2F883, { 0x382F, 0 } },
2510     { 0x2F884, { 0x5DFD, 0 } },
2511     { 0x2F885, { 0x5E28, 0 } },
2512     { 0x2F886, { 0x5E3D, 0 } },
2513     { 0x2F887, { 0x5E69, 0 } },
2514     { 0x2F888, { 0x3862, 0 } },
2515     { 0x2F889, { 0x22183, 0 } },
2516     { 0x2F88A, { 0x387C, 0 } },
2517     { 0x2F88B, { 0x5EB0, 0 } },
2518     { 0x2F88C, { 0x5EB3, 0 } },
2519     { 0x2F88D, { 0x5EB6, 0 } },
2520     { 0x2F88E, { 0x5ECA, 0 } },
2521     { 0x2F88F, { 0x2A392, 0 } },
2522     { 0x2F890, { 0x5EFE, 0 } },
2523     { 0x2F891, { 0x22331, 0 } },
2524     { 0x2F892, { 0x22331, 0 } },
2525     { 0x2F893, { 0x8201, 0 } },
2526     { 0x2F894, { 0x5F22, 0 } },
2527     { 0x2F895, { 0x5F22, 0 } },
2528     { 0x2F896, { 0x38C7, 0 } },
2529     { 0x2F897, { 0x232B8, 0 } },
2530     { 0x2F898, { 0x261DA, 0 } },
2531     { 0x2F899, { 0x5F62, 0 } },
2532     { 0x2F89A, { 0x5F6B, 0 } },
2533     { 0x2F89B, { 0x38E3, 0 } },
2534     { 0x2F89C, { 0x5F9A, 0 } },
2535     { 0x2F89D, { 0x5FCD, 0 } },
2536     { 0x2F89E, { 0x5FD7, 0 } },
2537     { 0x2F89F, { 0x5FF9, 0 } },
2538     { 0x2F8A0, { 0x6081, 0 } },
2539     { 0x2F8A1, { 0x393A, 0 } },
2540     { 0x2F8A2, { 0x391C, 0 } },
2541     { 0x2F8A3, { 0x6094, 0 } },
2542     { 0x2F8A4, { 0x226D4, 0 } },
2543     { 0x2F8A5, { 0x60C7, 0 } },
2544     { 0x2F8A6, { 0x6148, 0 } },
2545     { 0x2F8A7, { 0x614C, 0 } },
2546     { 0x2F8A8, { 0x614E, 0 } },
2547     { 0x2F8A9, { 0x614C, 0 } },
2548     { 0x2F8AA, { 0x617A, 0 } },
2549     { 0x2F8AB, { 0x618E, 0 } },
2550     { 0x2F8AC, { 0x61B2, 0 } },
2551     { 0x2F8AD, { 0x61A4, 0 } },
2552     { 0x2F8AE, { 0x61AF, 0 } },
2553     { 0x2F8AF, { 0x61DE, 0 } },
2554     { 0x2F8B0, { 0x61F2, 0 } },
2555     { 0x2F8B1, { 0x61F6, 0 } },
2556     { 0x2F8B2, { 0x6210, 0 } },
2557     { 0x2F8B3, { 0x621B, 0 } },
2558     { 0x2F8B4, { 0x625D, 0 } },
2559     { 0x2F8B5, { 0x62B1, 0 } },
2560     { 0x2F8B6, { 0x62D4, 0 } },
2561     { 0x2F8B7, { 0x6350, 0 } },
2562     { 0x2F8B8, { 0x22B0C, 0 } },
2563     { 0x2F8B9, { 0x633D, 0 } },
2564     { 0x2F8BA, { 0x62FC, 0 } },
2565     { 0x2F8BB, { 0x6368, 0 } },
2566     { 0x2F8BC, { 0x6383, 0 } },
2567     { 0x2F8BD, { 0x63E4, 0 } },
2568     { 0x2F8BE, { 0x22BF1, 0 } },
2569     { 0x2F8BF, { 0x6422, 0 } },
2570     { 0x2F8C0, { 0x63C5, 0 } },
2571     { 0x2F8C1, { 0x63A9, 0 } },
2572     { 0x2F8C2, { 0x3A2E, 0 } },
2573     { 0x2F8C3, { 0x6469, 0 } },
2574     { 0x2F8C4, { 0x647E, 0 } },
2575     { 0x2F8C5, { 0x649D, 0 } },
2576     { 0x2F8C6, { 0x6477, 0 } },
2577     { 0x2F8C7, { 0x3A6C, 0 } },
2578     { 0x2F8C8, { 0x654F, 0 } },
2579     { 0x2F8C9, { 0x656C, 0 } },
2580     { 0x2F8CA, { 0x2300A, 0 } },
2581     { 0x2F8CB, { 0x65E3, 0 } },
2582     { 0x2F8CC, { 0x66F8, 0 } },
2583     { 0x2F8CD, { 0x6649, 0 } },
2584     { 0x2F8CE, { 0x3B19, 0 } },
2585     { 0x2F8CF, { 0x6691, 0 } },
2586     { 0x2F8D0, { 0x3B08, 0 } },
2587     { 0x2F8D1, { 0x3AE4, 0 } },
2588     { 0x2F8D2, { 0x5192, 0 } },
2589     { 0x2F8D3, { 0x5195, 0 } },
2590     { 0x2F8D4, { 0x6700, 0 } },
2591     { 0x2F8D5, { 0x669C, 0 } },
2592     { 0x2F8D6, { 0x80AD, 0 } },
2593     { 0x2F8D7, { 0x43D9, 0 } },
2594     { 0x2F8D8, { 0x6717, 0 } },
2595     { 0x2F8D9, { 0x671B, 0 } },
2596     { 0x2F8DA, { 0x6721, 0 } },
2597     { 0x2F8DB, { 0x675E, 0 } },
2598     { 0x2F8DC, { 0x6753, 0 } },
2599     { 0x2F8DD, { 0x233C3, 0 } },
2600     { 0x2F8DE, { 0x3B49, 0 } },
2601     { 0x2F8DF, { 0x67FA, 0 } },
2602     { 0x2F8E0, { 0x6785, 0 } },
2603     { 0x2F8E1, { 0x6852, 0 } },
2604     { 0x2F8E2, { 0x6885, 0 } },
2605     { 0x2F8E3, { 0x2346D, 0 } },
2606     { 0x2F8E4, { 0x688E, 0 } },
2607     { 0x2F8E5, { 0x681F, 0 } },
2608     { 0x2F8E6, { 0x6914, 0 } },
2609     { 0x2F8E7, { 0x3B9D, 0 } },
2610     { 0x2F8E8, { 0x6942, 0 } },
2611     { 0x2F8E9, { 0x69A3, 0 } },
2612     { 0x2F8EA, { 0x69EA, 0 } },
2613     { 0x2F8EB, { 0x6AA8, 0 } },
2614     { 0x2F8EC, { 0x236A3, 0 } },
2615     { 0x2F8ED, { 0x6ADB, 0 } },
2616     { 0x2F8EE, { 0x3C18, 0 } },
2617     { 0x2F8EF, { 0x6B21, 0 } },
2618     { 0x2F8F0, { 0x238A7, 0 } },
2619     { 0x2F8F1, { 0x6B54, 0 } },
2620     { 0x2F8F2, { 0x3C4E, 0 } },
2621     { 0x2F8F3, { 0x6B72, 0 } },
2622     { 0x2F8F4, { 0x6B9F, 0 } },
2623     { 0x2F8F5, { 0x6BBA, 0 } },
2624     { 0x2F8F6, { 0x6BBB, 0 } },
2625     { 0x2F8F7, { 0x23A8D, 0 } },
2626     { 0x2F8F8, { 0x21D0B, 0 } },
2627     { 0x2F8F9, { 0x23AFA, 0 } },
2628     { 0x2F8FA, { 0x6C4E, 0 } },
2629     { 0x2F8FB, { 0x23CBC, 0 } },
2630     { 0x2F8FC, { 0x6CBF, 0 } },
2631     { 0x2F8FD, { 0x6CCD, 0 } },
2632     { 0x2F8FE, { 0x6C67, 0 } },
2633     { 0x2F8FF, { 0x6D16, 0 } },
2634     { 0x2F900, { 0x6D3E, 0 } },
2635     { 0x2F901, { 0x6D77, 0 } },
2636     { 0x2F902, { 0x6D41, 0 } },
2637     { 0x2F903, { 0x6D69, 0 } },
2638     { 0x2F904, { 0x6D78, 0 } },
2639     { 0x2F905, { 0x6D85, 0 } },
2640     { 0x2F906, { 0x23D1E, 0 } },
2641     { 0x2F907, { 0x6D34, 0 } },
2642     { 0x2F908, { 0x6E2F, 0 } },
2643     { 0x2F909, { 0x6E6E, 0 } },
2644     { 0x2F90A, { 0x3D33, 0 } },
2645     { 0x2F90B, { 0x6ECB, 0 } },
2646     { 0x2F90C, { 0x6EC7, 0 } },
2647     { 0x2F90D, { 0x23ED1, 0 } },
2648     { 0x2F90E, { 0x6DF9, 0 } },
2649     { 0x2F90F, { 0x6F6E, 0 } },
2650     { 0x2F910, { 0x23F5E, 0 } },
2651     { 0x2F911, { 0x23F8E, 0 } },
2652     { 0x2F912, { 0x6FC6, 0 } },
2653     { 0x2F913, { 0x7039, 0 } },
2654     { 0x2F914, { 0x701E, 0 } },
2655     { 0x2F915, { 0x701B, 0 } },
2656     { 0x2F916, { 0x3D96, 0 } },
2657     { 0x2F917, { 0x704A, 0 } },
2658     { 0x2F918, { 0x707D, 0 } },
2659     { 0x2F919, { 0x7077, 0 } },
2660     { 0x2F91A, { 0x70AD, 0 } },
2661     { 0x2F91B, { 0x20525, 0 } },
2662     { 0x2F91C, { 0x7145, 0 } },
2663     { 0x2F91D, { 0x24263, 0 } },
2664     { 0x2F91E, { 0x719C, 0 } },
2665     { 0x2F91F, { 0x243AB, 0 } },
2666     { 0x2F920, { 0x7228, 0 } },
2667     { 0x2F921, { 0x7235, 0 } },
2668     { 0x2F922, { 0x7250, 0 } },
2669     { 0x2F923, { 0x24608, 0 } },
2670     { 0x2F924, { 0x7280, 0 } },
2671     { 0x2F925, { 0x7295, 0 } },
2672     { 0x2F926, { 0x24735, 0 } },
2673     { 0x2F927, { 0x24814, 0 } },
2674     { 0x2F928, { 0x737A, 0 } },
2675     { 0x2F929, { 0x738B, 0 } },
2676     { 0x2F92A, { 0x3EAC, 0 } },
2677     { 0x2F92B, { 0x73A5, 0 } },
2678     { 0x2F92C, { 0x3EB8, 0 } },
2679     { 0x2F92D, { 0x3EB8, 0 } },
2680     { 0x2F92E, { 0x7447, 0 } },
2681     { 0x2F92F, { 0x745C, 0 } },
2682     { 0x2F930, { 0x7471, 0 } },
2683     { 0x2F931, { 0x7485, 0 } },
2684     { 0x2F932, { 0x74CA, 0 } },
2685     { 0x2F933, { 0x3F1B, 0 } },
2686     { 0x2F934, { 0x7524, 0 } },
2687     { 0x2F935, { 0x24C36, 0 } },
2688     { 0x2F936, { 0x753E, 0 } },
2689     { 0x2F937, { 0x24C92, 0 } },
2690     { 0x2F938, { 0x7570, 0 } },
2691     { 0x2F939, { 0x2219F, 0 } },
2692     { 0x2F93A, { 0x7610, 0 } },
2693     { 0x2F93B, { 0x24FA1, 0 } },
2694     { 0x2F93C, { 0x24FB8, 0 } },
2695     { 0x2F93D, { 0x25044, 0 } },
2696     { 0x2F93E, { 0x3FFC, 0 } },
2697     { 0x2F93F, { 0x4008, 0 } },
2698     { 0x2F940, { 0x76F4, 0 } },
2699     { 0x2F941, { 0x250F3, 0 } },
2700     { 0x2F942, { 0x250F2, 0 } },
2701     { 0x2F943, { 0x25119, 0 } },
2702     { 0x2F944, { 0x25133, 0 } },
2703     { 0x2F945, { 0x771E, 0 } },
2704     { 0x2F946, { 0x771F, 0 } },
2705     { 0x2F947, { 0x771F, 0 } },
2706     { 0x2F948, { 0x774A, 0 } },
2707     { 0x2F949, { 0x4039, 0 } },
2708     { 0x2F94A, { 0x778B, 0 } },
2709     { 0x2F94B, { 0x4046, 0 } },
2710     { 0x2F94C, { 0x4096, 0 } },
2711     { 0x2F94D, { 0x2541D, 0 } },
2712     { 0x2F94E, { 0x784E, 0 } },
2713     { 0x2F94F, { 0x788C, 0 } },
2714     { 0x2F950, { 0x78CC, 0 } },
2715     { 0x2F951, { 0x40E3, 0 } },
2716     { 0x2F952, { 0x25626, 0 } },
2717     { 0x2F953, { 0x7956, 0 } },
2718     { 0x2F954, { 0x2569A, 0 } },
2719     { 0x2F955, { 0x256C5, 0 } },
2720     { 0x2F956, { 0x798F, 0 } },
2721     { 0x2F957, { 0x79EB, 0 } },
2722     { 0x2F958, { 0x412F, 0 } },
2723     { 0x2F959, { 0x7A40, 0 } },
2724     { 0x2F95A, { 0x7A4A, 0 } },
2725     { 0x2F95B, { 0x7A4F, 0 } },
2726     { 0x2F95C, { 0x2597C, 0 } },
2727     { 0x2F95D, { 0x25AA7, 0 } },
2728     { 0x2F95E, { 0x25AA7, 0 } },
2729     { 0x2F95F, { 0x7AEE, 0 } },
2730     { 0x2F960, { 0x4202, 0 } },
2731     { 0x2F961, { 0x25BAB, 0 } },
2732     { 0x2F962, { 0x7BC6, 0 } },
2733     { 0x2F963, { 0x7BC9, 0 } },
2734     { 0x2F964, { 0x4227, 0 } },
2735     { 0x2F965, { 0x25C80, 0 } },
2736     { 0x2F966, { 0x7CD2, 0 } },
2737     { 0x2F967, { 0x42A0, 0 } },
2738     { 0x2F968, { 0x7CE8, 0 } },
2739     { 0x2F969, { 0x7CE3, 0 } },
2740     { 0x2F96A, { 0x7D00, 0 } },
2741     { 0x2F96B, { 0x25F86, 0 } },
2742     { 0x2F96C, { 0x7D63, 0 } },
2743     { 0x2F96D, { 0x4301, 0 } },
2744     { 0x2F96E, { 0x7DC7, 0 } },
2745     { 0x2F96F, { 0x7E02, 0 } },
2746     { 0x2F970, { 0x7E45, 0 } },
2747     { 0x2F971, { 0x4334, 0 } },
2748     { 0x2F972, { 0x26228, 0 } },
2749     { 0x2F973, { 0x26247, 0 } },
2750     { 0x2F974, { 0x4359, 0 } },
2751     { 0x2F975, { 0x262D9, 0 } },
2752     { 0x2F976, { 0x7F7A, 0 } },
2753     { 0x2F977, { 0x2633E, 0 } },
2754     { 0x2F978, { 0x7F95, 0 } },
2755     { 0x2F979, { 0x7FFA, 0 } },
2756     { 0x2F97A, { 0x8005, 0 } },
2757     { 0x2F97B, { 0x264DA, 0 } },
2758     { 0x2F97C, { 0x26523, 0 } },
2759     { 0x2F97D, { 0x8060, 0 } },
2760     { 0x2F97E, { 0x265A8, 0 } },
2761     { 0x2F97F, { 0x8070, 0 } },
2762     { 0x2F980, { 0x2335F, 0 } },
2763     { 0x2F981, { 0x43D5, 0 } },
2764     { 0x2F982, { 0x80B2, 0 } },
2765     { 0x2F983, { 0x8103, 0 } },
2766     { 0x2F984, { 0x440B, 0 } },
2767     { 0x2F985, { 0x813E, 0 } },
2768     { 0x2F986, { 0x5AB5, 0 } },
2769     { 0x2F987, { 0x267A7, 0 } },
2770     { 0x2F988, { 0x267B5, 0 } },
2771     { 0x2F989, { 0x23393, 0 } },
2772     { 0x2F98A, { 0x2339C, 0 } },
2773     { 0x2F98B, { 0x8201, 0 } },
2774     { 0x2F98C, { 0x8204, 0 } },
2775     { 0x2F98D, { 0x8F9E, 0 } },
2776     { 0x2F98E, { 0x446B, 0 } },
2777     { 0x2F98F, { 0x8291, 0 } },
2778     { 0x2F990, { 0x828B, 0 } },
2779     { 0x2F991, { 0x829D, 0 } },
2780     { 0x2F992, { 0x52B3, 0 } },
2781     { 0x2F993, { 0x82B1, 0 } },
2782     { 0x2F994, { 0x82B3, 0 } },
2783     { 0x2F995, { 0x82BD, 0 } },
2784     { 0x2F996, { 0x82E6, 0 } },
2785     { 0x2F997, { 0x26B3C, 0 } },
2786     { 0x2F998, { 0x82E5, 0 } },
2787     { 0x2F999, { 0x831D, 0 } },
2788     { 0x2F99A, { 0x8363, 0 } },
2789     { 0x2F99B, { 0x83AD, 0 } },
2790     { 0x2F99C, { 0x8323, 0 } },
2791     { 0x2F99D, { 0x83BD, 0 } },
2792     { 0x2F99E, { 0x83E7, 0 } },
2793     { 0x2F99F, { 0x8457, 0 } },
2794     { 0x2F9A0, { 0x8353, 0 } },
2795     { 0x2F9A1, { 0x83CA, 0 } },
2796     { 0x2F9A2, { 0x83CC, 0 } },
2797     { 0x2F9A3, { 0x83DC, 0 } },
2798     { 0x2F9A4, { 0x26C36, 0 } },
2799     { 0x2F9A5, { 0x26D6B, 0 } },
2800     { 0x2F9A6, { 0x26CD5, 0 } },
2801     { 0x2F9A7, { 0x452B, 0 } },
2802     { 0x2F9A8, { 0x84F1, 0 } },
2803     { 0x2F9A9, { 0x84F3, 0 } },
2804     { 0x2F9AA, { 0x8516, 0 } },
2805     { 0x2F9AB, { 0x273CA, 0 } },
2806     { 0x2F9AC, { 0x8564, 0 } },
2807     { 0x2F9AD, { 0x26F2C, 0 } },
2808     { 0x2F9AE, { 0x455D, 0 } },
2809     { 0x2F9AF, { 0x4561, 0 } },
2810     { 0x2F9B0, { 0x26FB1, 0 } },
2811     { 0x2F9B1, { 0x270D2, 0 } },
2812     { 0x2F9B2, { 0x456B, 0 } },
2813     { 0x2F9B3, { 0x8650, 0 } },
2814     { 0x2F9B4, { 0x865C, 0 } },
2815     { 0x2F9B5, { 0x8667, 0 } },
2816     { 0x2F9B6, { 0x8669, 0 } },
2817     { 0x2F9B7, { 0x86A9, 0 } },
2818     { 0x2F9B8, { 0x8688, 0 } },
2819     { 0x2F9B9, { 0x870E, 0 } },
2820     { 0x2F9BA, { 0x86E2, 0 } },
2821     { 0x2F9BB, { 0x8779, 0 } },
2822     { 0x2F9BC, { 0x8728, 0 } },
2823     { 0x2F9BD, { 0x876B, 0 } },
2824     { 0x2F9BE, { 0x8786, 0 } },
2825     { 0x2F9BF, { 0x45D7, 0 } },
2826     { 0x2F9C0, { 0x87E1, 0 } },
2827     { 0x2F9C1, { 0x8801, 0 } },
2828     { 0x2F9C2, { 0x45F9, 0 } },
2829     { 0x2F9C3, { 0x8860, 0 } },
2830     { 0x2F9C4, { 0x8863, 0 } },
2831     { 0x2F9C5, { 0x27667, 0 } },
2832     { 0x2F9C6, { 0x88D7, 0 } },
2833     { 0x2F9C7, { 0x88DE, 0 } },
2834     { 0x2F9C8, { 0x4635, 0 } },
2835     { 0x2F9C9, { 0x88FA, 0 } },
2836     { 0x2F9CA, { 0x34BB, 0 } },
2837     { 0x2F9CB, { 0x278AE, 0 } },
2838     { 0x2F9CC, { 0x27966, 0 } },
2839     { 0x2F9CD, { 0x46BE, 0 } },
2840     { 0x2F9CE, { 0x46C7, 0 } },
2841     { 0x2F9CF, { 0x8AA0, 0 } },
2842     { 0x2F9D0, { 0x8AED, 0 } },
2843     { 0x2F9D1, { 0x8B8A, 0 } },
2844     { 0x2F9D2, { 0x8C55, 0 } },
2845     { 0x2F9D3, { 0x27CA8, 0 } },
2846     { 0x2F9D4, { 0x8CAB, 0 } },
2847     { 0x2F9D5, { 0x8CC1, 0 } },
2848     { 0x2F9D6, { 0x8D1B, 0 } },
2849     { 0x2F9D7, { 0x8D77, 0 } },
2850     { 0x2F9D8, { 0x27F2F, 0 } },
2851     { 0x2F9D9, { 0x20804, 0 } },
2852     { 0x2F9DA, { 0x8DCB, 0 } },
2853     { 0x2F9DB, { 0x8DBC, 0 } },
2854     { 0x2F9DC, { 0x8DF0, 0 } },
2855     { 0x2F9DD, { 0x208DE, 0 } },
2856     { 0x2F9DE, { 0x8ED4, 0 } },
2857     { 0x2F9DF, { 0x8F38, 0 } },
2858     { 0x2F9E0, { 0x285D2, 0 } },
2859     { 0x2F9E1, { 0x285ED, 0 } },
2860     { 0x2F9E2, { 0x9094, 0 } },
2861     { 0x2F9E3, { 0x90F1, 0 } },
2862     { 0x2F9E4, { 0x9111, 0 } },
2863     { 0x2F9E5, { 0x2872E, 0 } },
2864     { 0x2F9E6, { 0x911B, 0 } },
2865     { 0x2F9E7, { 0x9238, 0 } },
2866     { 0x2F9E8, { 0x92D7, 0 } },
2867     { 0x2F9E9, { 0x92D8, 0 } },
2868     { 0x2F9EA, { 0x927C, 0 } },
2869     { 0x2F9EB, { 0x93F9, 0 } },
2870     { 0x2F9EC, { 0x9415, 0 } },
2871     { 0x2F9ED, { 0x28BFA, 0 } },
2872     { 0x2F9EE, { 0x958B, 0 } },
2873     { 0x2F9EF, { 0x4995, 0 } },
2874     { 0x2F9F0, { 0x95B7, 0 } },
2875     { 0x2F9F1, { 0x28D77, 0 } },
2876     { 0x2F9F2, { 0x49E6, 0 } },
2877     { 0x2F9F3, { 0x96C3, 0 } },
2878     { 0x2F9F4, { 0x5DB2, 0 } },
2879     { 0x2F9F5, { 0x9723, 0 } },
2880     { 0x2F9F6, { 0x29145, 0 } },
2881     { 0x2F9F7, { 0x2921A, 0 } },
2882     { 0x2F9F8, { 0x4A6E, 0 } },
2883     { 0x2F9F9, { 0x4A76, 0 } },
2884     { 0x2F9FA, { 0x97E0, 0 } },
2885     { 0x2F9FB, { 0x2940A, 0 } },
2886     { 0x2F9FC, { 0x4AB2, 0 } },
2887     { 0x2F9FD, { 0x29496, 0 } },
2888     { 0x2F9FE, { 0x980B, 0 } },
2889     { 0x2F9FF, { 0x980B, 0 } },
2890     { 0x2FA00, { 0x9829, 0 } },
2891     { 0x2FA01, { 0x295B6, 0 } },
2892     { 0x2FA02, { 0x98E2, 0 } },
2893     { 0x2FA03, { 0x4B33, 0 } },
2894     { 0x2FA04, { 0x9929, 0 } },
2895     { 0x2FA05, { 0x99A7, 0 } },
2896     { 0x2FA06, { 0x99C2, 0 } },
2897     { 0x2FA07, { 0x99FE, 0 } },
2898     { 0x2FA08, { 0x4BCE, 0 } },
2899     { 0x2FA09, { 0x29B30, 0 } },
2900     { 0x2FA0A, { 0x9B12, 0 } },
2901     { 0x2FA0B, { 0x9C40, 0 } },
2902     { 0x2FA0C, { 0x9CFD, 0 } },
2903     { 0x2FA0D, { 0x4CCE, 0 } },
2904     { 0x2FA0E, { 0x4CED, 0 } },
2905     { 0x2FA0F, { 0x9D67, 0 } },
2906     { 0x2FA10, { 0x2A0CE, 0 } },
2907     { 0x2FA11, { 0x4CF8, 0 } },
2908     { 0x2FA12, { 0x2A105, 0 } },
2909     { 0x2FA13, { 0x2A20E, 0 } },
2910     { 0x2FA14, { 0x2A291, 0 } },
2911     { 0x2FA15, { 0x9EBB, 0 } },
2912     { 0x2FA16, { 0x4D56, 0 } },
2913     { 0x2FA17, { 0x9EF9, 0 } },
2914     { 0x2FA18, { 0x9EFE, 0 } },
2915     { 0x2FA19, { 0x9F05, 0 } },
2916     { 0x2FA1A, { 0x9F0F, 0 } },
2917     { 0x2FA1B, { 0x9F16, 0 } },
2918     { 0x2FA1C, { 0x9F3B, 0 } },
2919     { 0x2FA1D, { 0x2A600, 0 } }
2920 };
2921 
2922 static GX_UNICODE_RANGE gx_studio_nfc_quick_check_no_table[] =
2923 {
2924     { 0x0340, 0x0341 },   /* Mn[2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK */
2925     { 0x0343, 0x0344 },   /*  Mn[2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS */
2926     { 0x0374, 0x0374 },   /* Lm       GREEK NUMERAL SIGN */
2927     { 0x037E, 0x037E },   /* Po       GREEK QUESTION MARK */
2928     { 0x0387, 0x0387 },   /* Po       GREEK ANO TELEIA */
2929     { 0x0958, 0x095F },   /* Lo[8] DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA */
2930     { 0x09DC, 0x09DD },   /* Lo[2] BENGALI LETTER RRA..BENGALI LETTER RHA */
2931     { 0x09DF, 0x09DF },   /* Lo       BENGALI LETTER YYA */
2932     { 0x0A33, 0x0A33 },   /* Lo       GURMUKHI LETTER LLA */
2933     { 0x0A36, 0x0A36 },   /* Lo       GURMUKHI LETTER SHA */
2934     { 0x0A59, 0x0A5B },   /* Lo[3] GURMUKHI LETTER KHHA..GURMUKHI LETTER ZA */
2935     { 0x0A5E, 0x0A5E },   /* Lo       GURMUKHI LETTER FA */
2936     { 0x0B5C, 0x0B5D },   /* Lo[2] ORIYA LETTER RRA..ORIYA LETTER RHA */
2937     { 0x0F43, 0x0F43 },   /* Lo       TIBETAN LETTER GHA */
2938     { 0x0F4D, 0x0F4D },   /* Lo       TIBETAN LETTER DDHA */
2939     { 0x0F52, 0x0F52 },   /* Lo       TIBETAN LETTER DHA */
2940     { 0x0F57, 0x0F57 },   /* Lo       TIBETAN LETTER BHA */
2941     { 0x0F5C, 0x0F5C },   /* Lo       TIBETAN LETTER DZHA */
2942     { 0x0F69, 0x0F69 },   /* Lo       TIBETAN LETTER KSSA */
2943     { 0x0F73, 0x0F73 },   /* Mn       TIBETAN VOWEL SIGN II */
2944     { 0x0F75, 0x0F76 },   /* Mn[2] TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC R */
2945     { 0x0F78, 0x0F78 },   /* Mn       TIBETAN VOWEL SIGN VOCALIC L */
2946     { 0x0F81, 0x0F81 },   /* Mn       TIBETAN VOWEL SIGN REVERSED II */
2947     { 0x0F93, 0x0F93 },   /* Mn       TIBETAN SUBJOINED LETTER GHA */
2948     { 0x0F9D, 0x0F9D },   /* Mn       TIBETAN SUBJOINED LETTER DDHA */
2949     { 0x0FA2, 0x0FA2 },   /* Mn       TIBETAN SUBJOINED LETTER DHA */
2950     { 0x0FA7, 0x0FA7 },   /* Mn       TIBETAN SUBJOINED LETTER BHA */
2951     { 0x0FAC, 0x0FAC },   /* Mn       TIBETAN SUBJOINED LETTER DZHA */
2952     { 0x0FB9, 0x0FB9 },   /* Mn       TIBETAN SUBJOINED LETTER KSSA */
2953     { 0x1F71, 0x1F71 },   /* L&       GREEK SMALL LETTER ALPHA WITH OXIA */
2954     { 0x1F73, 0x1F73 },   /* L&       GREEK SMALL LETTER EPSILON WITH OXIA */
2955     { 0x1F75, 0x1F75 },   /* L&       GREEK SMALL LETTER ETA WITH OXIA */
2956     { 0x1F77, 0x1F77 },   /* L&       GREEK SMALL LETTER IOTA WITH OXIA */
2957     { 0x1F79, 0x1F79 },   /* L&       GREEK SMALL LETTER OMICRON WITH OXIA */
2958     { 0x1F7B, 0x1F7B },   /* L&       GREEK SMALL LETTER UPSILON WITH OXIA */
2959     { 0x1F7D, 0x1F7D },   /* L&       GREEK SMALL LETTER OMEGA WITH OXIA */
2960     { 0x1FBB, 0x1FBB },   /* L&       GREEK CAPITAL LETTER ALPHA WITH OXIA */
2961     { 0x1FBE, 0x1FBE },   /* L&       GREEK PROSGEGRAMMENI */
2962     { 0x1FC9, 0x1FC9 },   /* L&       GREEK CAPITAL LETTER EPSILON WITH OXIA */
2963     { 0x1FCB, 0x1FCB },   /* L&       GREEK CAPITAL LETTER ETA WITH OXIA */
2964     { 0x1FD3, 0x1FD3 },   /* L&       GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
2965     { 0x1FDB, 0x1FDB },   /* L&       GREEK CAPITAL LETTER IOTA WITH OXIA */
2966     { 0x1FE3, 0x1FE3 },   /* L&       GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
2967     { 0x1FEB, 0x1FEB },   /* L&       GREEK CAPITAL LETTER UPSILON WITH OXIA */
2968     { 0x1FEE, 0x1FEF },   /* Sk[2] GREEK DIALYTIKA AND OXIA..GREEK VARIA */
2969     { 0x1FF9, 0x1FF9 },   /* L&       GREEK CAPITAL LETTER OMICRON WITH OXIA */
2970     { 0x1FFB, 0x1FFB },   /* L&       GREEK CAPITAL LETTER OMEGA WITH OXIA */
2971     { 0x1FFD, 0x1FFD },   /* Sk       GREEK OXIA */
2972     { 0x2000, 0x2001 },   /* Zs[2] EN QUAD..EM QUAD */
2973     { 0x2126, 0x2126 },   /* L&       OHM SIGN */
2974     { 0x212A, 0x212B },   /* L&[2] KELVIN SIGN..ANGSTROM SIGN */
2975     { 0x2329, 0x2329 },   /* Ps       LEFT - POINTING ANGLE BRACKET */
2976     { 0x232A, 0x232A },   /* Pe       RIGHT - POINTING ANGLE BRACKET */
2977     { 0x2ADC, 0x2ADC },   /* Sm       FORKING */
2978     { 0xF900, 0xFA0D },   /* Lo[270] CJK COMPATIBILITY IDEOGRAPH - F900..CJK COMPATIBILITY IDEOGRAPH - FA0D */
2979     { 0xFA10, 0xFA10 },   /* Lo       CJK COMPATIBILITY IDEOGRAPH - FA10 */
2980     { 0xFA12, 0xFA12 },   /* Lo       CJK COMPATIBILITY IDEOGRAPH - FA12 */
2981     { 0xFA15, 0xFA1E },   /* Lo[10] CJK COMPATIBILITY IDEOGRAPH - FA15..CJK COMPATIBILITY IDEOGRAPH - FA1E */
2982     { 0xFA20, 0xFA20 },   /* Lo       CJK COMPATIBILITY IDEOGRAPH - FA20 */
2983     { 0xFA22, 0xFA22 },   /* Lo       CJK COMPATIBILITY IDEOGRAPH - FA22 */
2984     { 0xFA25, 0xFA26 },   /* Lo[2] CJK COMPATIBILITY IDEOGRAPH - FA25..CJK COMPATIBILITY IDEOGRAPH - FA26 */
2985     { 0xFA2A, 0xFA6D },   /* Lo[68] CJK COMPATIBILITY IDEOGRAPH - FA2A..CJK COMPATIBILITY IDEOGRAPH - FA6D */
2986     { 0xFA70, 0xFAD9 },   /* Lo[106] CJK COMPATIBILITY IDEOGRAPH - FA70..CJK COMPATIBILITY IDEOGRAPH - FAD9 */
2987     { 0xFB1D, 0xFB1D },   /* Lo       HEBREW LETTER YOD WITH HIRIQ */
2988     { 0xFB1F, 0xFB1F },   /* Lo       HEBREW LIGATURE YIDDISH YOD YOD PATAH */
2989     { 0xFB2A, 0xFB36 },   /* Lo[13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH */
2990     { 0xFB38, 0xFB3C },   /* Lo[5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH */
2991     { 0xFB3E, 0xFB3E },   /* Lo       HEBREW LETTER MEM WITH DAGESH */
2992     { 0xFB40, 0xFB41 },   /* Lo[2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH */
2993     { 0xFB43, 0xFB44 },   /* Lo[2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH */
2994     { 0xFB46, 0xFB4E },   /* Lo[9] HEBREW LETTER TSADI WITH DAGESH..HEBREW LETTER PE WITH RAFE */
2995     { 0x1D15E, 0x1D164 }, /* So[7] MUSICAL SYMBOL HALF NOTE..MUSICAL SYMBOL ONE HUNDRED TWENTY - EIGHTH NOTE */
2996     { 0x1D1BB, 0x1D1C0 }, /* So[6] MUSICAL SYMBOL MINIMA..MUSICAL SYMBOL FUSA BLACK */
2997     { 0x2F800, 0x2FA1D }, /* Lo[542] CJK COMPATIBILITY IDEOGRAPH - 2F800..CJK COMPATIBILITY IDEOGRAPH - 2FA1D */
2998     { 0, 0 }
2999 };
3000 
3001 static GX_UNICODE_RANGE gx_studio_nfc_quick_check_maye_table[] =
3002 {
3003     { 0x0300, 0x0304 },   /* Mn[5] COMBINING GRAVE ACCENT..COMBINING MACRON */
3004     { 0x0306, 0x030C },   /* Mn[7] COMBINING BREVE..COMBINING CARON */
3005     { 0x030F, 0x030F },   /* Mn       COMBINING DOUBLE GRAVE ACCENT */
3006     { 0x0311, 0x0311 },   /* Mn       COMBINING INVERTED BREVE */
3007     { 0x0313, 0x0314 },   /* Mn[2] COMBINING COMMA ABOVE..COMBINING REVERSED COMMA ABOVE */
3008     { 0x031B, 0x031B },   /* Mn       COMBINING HORN */
3009     { 0x0323, 0x0328 },   /* Mn[6] COMBINING DOT BELOW..COMBINING OGONEK */
3010     { 0x032D, 0x032E },   /* Mn[2] COMBINING CIRCUMFLEX ACCENT BELOW..COMBINING BREVE BELOW */
3011     { 0x0330, 0x0331 },   /* Mn[2] COMBINING TILDE BELOW..COMBINING MACRON BELOW */
3012     { 0x0338, 0x0338 },   /* Mn       COMBINING LONG SOLIDUS OVERLAY */
3013     { 0x0342, 0x0342 },   /* Mn       COMBINING GREEK PERISPOMENI */
3014     { 0x0345, 0x0345 },   /* Mn       COMBINING GREEK YPOGEGRAMMENI */
3015     { 0x0653, 0x0655 },   /* Mn[3] ARABIC MADDAH ABOVE..ARABIC HAMZA BELOW */
3016     { 0x093C, 0x093C },   /* Mn       DEVANAGARI SIGN NUKTA */
3017     { 0x09BE, 0x09BE },   /* Mc       BENGALI VOWEL SIGN AA */
3018     { 0x09D7, 0x09D7 },   /* Mc       BENGALI AU LENGTH MARK */
3019     { 0x0B3E, 0x0B3E },   /* Mc       ORIYA VOWEL SIGN AA */
3020     { 0x0B56, 0x0B56 },   /* Mn       ORIYA AI LENGTH MARK */
3021     { 0x0B57, 0x0B57 },   /* Mc       ORIYA AU LENGTH MARK */
3022     { 0x0BBE, 0x0BBE },   /* Mc       TAMIL VOWEL SIGN AA */
3023     { 0x0BD7, 0x0BD7 },   /* Mc       TAMIL AU LENGTH MARK */
3024     { 0x0C56, 0x0C56 },   /* Mn       TELUGU AI LENGTH MARK */
3025     { 0x0CC2, 0x0CC2 },   /* Mc       KANNADA VOWEL SIGN UU */
3026     { 0x0CD5, 0x0CD6 },   /* Mc[2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK */
3027     { 0x0D3E, 0x0D3E },   /* Mc       MALAYALAM VOWEL SIGN AA */
3028     { 0x0D57, 0x0D57 },   /* Mc       MALAYALAM AU LENGTH MARK */
3029     { 0x0DCA, 0x0DCA },   /* Mn       SINHALA SIGN AL - LAKUNA */
3030     { 0x0DCF, 0x0DCF },   /* Mc       SINHALA VOWEL SIGN AELA - PILLA */
3031     { 0x0DDF, 0x0DDF },   /* Mc       SINHALA VOWEL SIGN GAYANUKITTA */
3032     { 0x102E, 0x102E },   /* Mn       MYANMAR VOWEL SIGN II */
3033     { 0x1161, 0x1175 },   /* Lo[21] HANGUL JUNGSEONG A..HANGUL JUNGSEONG I */
3034     { 0x11A8, 0x11C2 },   /* Lo[27] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG HIEUH */
3035     { 0x1B35, 0x1B35 },   /* Mc       BALINESE VOWEL SIGN TEDUNG */
3036     { 0x3099, 0x309A },   /* Mn[2] COMBINING KATAKANA - HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA - HIRAGANA SEMI - VOICED SOUND MARK */
3037     { 0x110BA, 0x110BA }, /* Mn       KAITHI SIGN NUKTA */
3038     { 0x11127, 0x11127 }, /* Mn       CHAKMA VOWEL SIGN A */
3039     { 0x1133E, 0x1133E }, /* Mc       GRANTHA VOWEL SIGN AA */
3040     { 0x11357, 0x11357 }, /* Mc       GRANTHA AU LENGTH MARK */
3041     { 0x114B0, 0x114B0 }, /* Mc       TIRHUTA VOWEL SIGN AA */
3042     { 0x114BA, 0x114BA }, /* Mn       TIRHUTA VOWEL SIGN SHORT E */
3043     { 0x114BD, 0x114BD }, /* Mc       TIRHUTA VOWEL SIGN SHORT O */
3044     { 0x115AF, 0x115AF }, /* Mc       SIDDHAM VOWEL SIGN AA */
3045     { 0, 0 }
3046 };
3047 
3048 static GX_UNICODE_RANGE gx_studio_full_composition_exclusion_table[] =
3049 {
3050     { 0x0343, 0x0344 },    /* Full_Composition_Exclusion # Mn   [2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS */
3051     { 0x0374, 0x0374 },    /* Full_Composition_Exclusion # Lm       GREEK NUMERAL SIGN */
3052     { 0x037E, 0x037E },    /* Full_Composition_Exclusion # Po       GREEK QUESTION MARK */
3053     { 0x0387, 0x0387 },    /* Full_Composition_Exclusion # Po       GREEK ANO TELEIA */
3054     { 0x0958, 0x095F },    /* Full_Composition_Exclusion # Lo   [8] DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA */
3055     { 0x09DC, 0x09DD },    /* Full_Composition_Exclusion # Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA */
3056     { 0x09DF, 0x09DF },    /* Full_Composition_Exclusion # Lo       BENGALI LETTER YYA */
3057     { 0x0A33, 0x0A33 },    /* Full_Composition_Exclusion # Lo       GURMUKHI LETTER LLA */
3058     { 0x0A36, 0x0A36 },    /* Full_Composition_Exclusion # Lo       GURMUKHI LETTER SHA */
3059     { 0x0A59, 0x0A5B },    /* Full_Composition_Exclusion # Lo   [3] GURMUKHI LETTER KHHA..GURMUKHI LETTER ZA */
3060     { 0x0A5E, 0x0A5E },    /* Full_Composition_Exclusion # Lo       GURMUKHI LETTER FA */
3061     { 0x0B5C, 0x0B5D },    /* Full_Composition_Exclusion # Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA */
3062     { 0x0F43, 0x0F43 },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER GHA */
3063     { 0x0F4D, 0x0F4D },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER DDHA */
3064     { 0x0F52, 0x0F52 },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER DHA */
3065     { 0x0F57, 0x0F57 },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER BHA */
3066     { 0x0F5C, 0x0F5C },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER DZHA */
3067     { 0x0F69, 0x0F69 },    /* Full_Composition_Exclusion # Lo       TIBETAN LETTER KSSA */
3068     { 0x0F73, 0x0F73 },    /* Full_Composition_Exclusion # Mn       TIBETAN VOWEL SIGN II */
3069     { 0x0F75, 0x0F76 },    /* Full_Composition_Exclusion # Mn   [2] TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC R */
3070     { 0x0F78, 0x0F78 },    /* Full_Composition_Exclusion # Mn       TIBETAN VOWEL SIGN VOCALIC L */
3071     { 0x0F81, 0x0F81 },    /* Full_Composition_Exclusion # Mn       TIBETAN VOWEL SIGN REVERSED II */
3072     { 0x0F93, 0x0F93 },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER GHA */
3073     { 0x0F9D, 0x0F9D },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER DDHA */
3074     { 0x0FA2, 0x0FA2 },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER DHA */
3075     { 0x0FA7, 0x0FA7 },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER BHA */
3076     { 0x0FAC, 0x0FAC },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER DZHA */
3077     { 0x0FB9, 0x0FB9 },    /* Full_Composition_Exclusion # Mn       TIBETAN SUBJOINED LETTER KSSA */
3078     { 0x1F73, 0x1F73 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER EPSILON WITH OXIA */
3079     { 0x1F75, 0x1F75 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER ETA WITH OXIA */
3080     { 0x1F77, 0x1F77 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER IOTA WITH OXIA */
3081     { 0x1F79, 0x1F79 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER OMICRON WITH OXIA */
3082     { 0x1F7B, 0x1F7B },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER UPSILON WITH OXIA */
3083     { 0x1F7D, 0x1F7D },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER OMEGA WITH OXIA */
3084     { 0x1FBB, 0x1FBB },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER ALPHA WITH OXIA */
3085     { 0x1FBE, 0x1FBE },    /* Full_Composition_Exclusion # L&       GREEK PROSGEGRAMMENI */
3086     { 0x1FC9, 0x1FC9 },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER EPSILON WITH OXIA */
3087     { 0x1FCB, 0x1FCB },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER ETA WITH OXIA */
3088     { 0x1FD3, 0x1FD3 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
3089     { 0x1FDB, 0x1FDB },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER IOTA WITH OXIA */
3090     { 0x1FE3, 0x1FE3 },    /* Full_Composition_Exclusion # L&       GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
3091     { 0x1FEB, 0x1FEB },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER UPSILON WITH OXIA */
3092     { 0x1FEE, 0x1FEF },    /* Full_Composition_Exclusion # Sk   [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA */
3093     { 0x1FF9, 0x1FF9 },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER OMICRON WITH OXIA */
3094     { 0x1FFB, 0x1FFB },    /* Full_Composition_Exclusion # L&       GREEK CAPITAL LETTER OMEGA WITH OXIA */
3095     { 0x1FFD, 0x1FFD },    /* Full_Composition_Exclusion # Sk       GREEK OXIA */
3096     { 0x2000, 0x2001 },    /* Full_Composition_Exclusion # Zs   [2] EN QUAD..EM QUAD */
3097     { 0x2126, 0x2126 },    /* Full_Composition_Exclusion # L&       OHM SIGN */
3098     { 0x212A, 0x212B },    /* Full_Composition_Exclusion # L&   [2] KELVIN SIGN..ANGSTROM SIGN */
3099     { 0x2329, 0x2329 },    /* Full_Composition_Exclusion # Ps       LEFT-POINTING ANGLE BRACKET */
3100     { 0x232A, 0x232A },    /* Full_Composition_Exclusion # Pe       RIGHT-POINTING ANGLE BRACKET */
3101     { 0x2ADC, 0x2ADC },    /* Full_Composition_Exclusion # Sm       FORKING */
3102     { 0xF900, 0xFA0D },    /* Full_Composition_Exclusion # Lo [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D */
3103     { 0xFA10, 0xFA10 },    /* Full_Composition_Exclusion # Lo       CJK COMPATIBILITY IDEOGRAPH-FA10 */
3104     { 0xFA12, 0xFA12 },    /* Full_Composition_Exclusion # Lo       CJK COMPATIBILITY IDEOGRAPH-FA12 */
3105     { 0xFA15, 0xFA1E },    /* Full_Composition_Exclusion # Lo  [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E */
3106     { 0xFA20, 0xFA20 },    /* Full_Composition_Exclusion # Lo       CJK COMPATIBILITY IDEOGRAPH-FA20 */
3107     { 0xFA22, 0xFA22 },    /* Full_Composition_Exclusion # Lo       CJK COMPATIBILITY IDEOGRAPH-FA22 */
3108     { 0xFA25, 0xFA26 },    /* Full_Composition_Exclusion # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 */
3109     { 0xFA2A, 0xFA6D },    /* Full_Composition_Exclusion # Lo  [68] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA6D */
3110     { 0xFA70, 0xFAD9 },    /* Full_Composition_Exclusion # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 */
3111     { 0xFB1D, 0xFB1D },    /* Full_Composition_Exclusion # Lo       HEBREW LETTER YOD WITH HIRIQ */
3112     { 0xFB1F, 0xFB1F },    /* Full_Composition_Exclusion # Lo       HEBREW LIGATURE YIDDISH YOD YOD PATAH */
3113     { 0xFB2A, 0xFB36 },    /* Full_Composition_Exclusion # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH */
3114     { 0xFB38, 0xFB3C },    /* Full_Composition_Exclusion # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH */
3115     { 0xFB3E, 0xFB3E },    /* Full_Composition_Exclusion # Lo       HEBREW LETTER MEM WITH DAGESH */
3116     { 0xFB40, 0xFB41 },    /* Full_Composition_Exclusion # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH */
3117     { 0xFB43, 0xFB44 },    /* Full_Composition_Exclusion # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH */
3118     { 0xFB46, 0xFB4E },    /* Full_Composition_Exclusion # Lo   [9] HEBREW LETTER TSADI WITH DAGESH..HEBREW LETTER PE WITH RAFE */
3119     { 0x1D15E, 0x1D164 },  /* Full_Composition_Exclusion # So   [7] MUSICAL SYMBOL HALF NOTE..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE */
3120     { 0x1D1BB, 0x1D1C0 },  /* Full_Composition_Exclusion # So   [6] MUSICAL SYMBOL MINIMA..MUSICAL SYMBOL FUSA BLACK */
3121     { 0, 0 }
3122 };
3123 
3124 /**************************************************************************/
3125 /*    This function tests if a code point is full composition exclusion.  */
3126 /**************************************************************************/
gx_studio_full_composition_exclusion_test(ULONG unicode)3127 GX_BOOL gx_studio_full_composition_exclusion_test(ULONG unicode)
3128 {
3129     GX_UNICODE_RANGE *entry = gx_studio_full_composition_exclusion_table;
3130 
3131     while (entry->gx_unicode_range_start)
3132     {
3133         if ((unicode >= entry->gx_unicode_range_start) &&
3134             (unicode <= entry->gx_unicode_range_end))
3135         {
3136             return GX_TRUE;
3137         }
3138         entry++;
3139     }
3140 
3141     return GX_FALSE;
3142 }
3143 
3144 
3145 /**************************************************************************/
3146 /*    This function gets nfc quick check value for specified code point.  */
3147 /**************************************************************************/
gx_studio_nfc_quick_check(ULONG code_point,GX_UBYTE * return_type)3148 static UINT gx_studio_nfc_quick_check(ULONG code_point, GX_UBYTE *return_type)
3149 {
3150     GX_UNICODE_RANGE *entry = gx_studio_nfc_quick_check_no_table;
3151 
3152     while (entry->gx_unicode_range_start)
3153     {
3154         if (code_point >= entry->gx_unicode_range_start &&
3155             code_point <= entry->gx_unicode_range_end)
3156         {
3157             *return_type = GX_NORMALIZATION_FORM_NO;
3158             return GX_SUCCESS;
3159         }
3160 
3161         entry++;
3162     }
3163 
3164     entry = gx_studio_nfc_quick_check_maye_table;
3165 
3166     while (entry->gx_unicode_range_start)
3167     {
3168         if (code_point >= entry->gx_unicode_range_start &&
3169             code_point <= entry->gx_unicode_range_end)
3170         {
3171             *return_type = GX_NORMALIZATION_FORM_MAYBE;
3172             return GX_SUCCESS;
3173         }
3174         entry++;
3175     }
3176 
3177     *return_type = GX_NORMALIZATION_FORM_YES;
3178 
3179     return GX_SUCCESS;
3180 }
3181 
3182 /**************************************************************************/
3183 /*    This function retrieves canonical decomposition map of specified    */
3184 /*    code point.                                                         */
3185 /**************************************************************************/
gx_studio_canonical_decompress_map_get(ULONG code_point,ULONG * maps)3186 static UINT gx_studio_canonical_decompress_map_get(ULONG code_point, ULONG *maps)
3187 {
3188     GX_CANONICAL_DECOMPOSE_MAP *entry = gx_studio_canonical_decompose_maps;
3189 
3190     maps[0] = 0;
3191     maps[1] = 0;
3192 
3193     while (entry->gx_canonical_decompose_map_code)
3194     {
3195         if (code_point == entry->gx_canonical_decompose_map_code)
3196         {
3197             maps[0] = entry->gx_canonical_decompose_map[0];
3198             maps[1] = entry->gx_canonical_decompose_map[1];
3199             break;
3200         }
3201         else if (code_point < entry->gx_canonical_decompose_map_code)
3202         {
3203             break;
3204         }
3205 
3206         entry++;
3207     }
3208 
3209     return GX_SUCCESS;
3210 }
3211 
3212 /**************************************************************************/
3213 /*    This function retrieves the composed code point the specified       */
3214 /*    decomposition map is correspond to.                                 */
3215 /**************************************************************************/
gx_studio_canonical_composed_code_get(ULONG map_a,ULONG map_b,ULONG * composed_code)3216 static UINT gx_studio_canonical_composed_code_get(ULONG map_a, ULONG map_b, ULONG *composed_code)
3217 {
3218     GX_CANONICAL_DECOMPOSE_MAP *entry = gx_studio_canonical_decompose_maps;
3219 
3220     while (entry->gx_canonical_decompose_map_code)
3221     {
3222         if (entry->gx_canonical_decompose_map[0] == map_a &&
3223             entry->gx_canonical_decompose_map[1] == map_b)
3224         {
3225             *composed_code = entry->gx_canonical_decompose_map_code;
3226             return GX_SUCCESS;
3227         }
3228         entry++;
3229     }
3230 
3231     return GX_FAILURE;
3232 }
3233 
3234 /**************************************************************************/
3235 /*    This function retrieves canonical combining class of specified      */
3236 /*    code point.                                                         */
3237 /**************************************************************************/
gx_studio_canonical_combining_class_get(ULONG code_point,GX_UBYTE * class_value)3238 static UINT gx_studio_canonical_combining_class_get(ULONG code_point, GX_UBYTE *class_value)
3239 {
3240     GX_CANONICAL_COMBINING_CLASS *entry = gx_studio_canonical_combining_class_table;
3241 
3242     *class_value = 0;
3243 
3244     while (entry->gx_canonical_combining_class_code)
3245     {
3246         if (code_point == entry->gx_canonical_combining_class_code)
3247         {
3248             *class_value = entry->gx_canonical_combining_class;
3249             break;
3250         }
3251         else if (code_point < entry->gx_canonical_combining_class_code)
3252         {
3253             break;
3254         }
3255 
3256         entry++;
3257     }
3258 
3259     return GX_SUCCESS;
3260 }
3261 
3262 
3263 /**************************************************************************/
3264 /*    This function quickly determines whether a string x is in a nfc     */
3265 /*    normalization form.                                                 */
3266 /**************************************************************************/
gx_studio_nfc_form_detect(GX_CONST GX_STRING * string,GX_UBYTE * return_code)3267 static UINT gx_studio_nfc_form_detect(GX_CONST GX_STRING *string, GX_UBYTE *return_code)
3268 {
3269     UINT     ret;
3270     GX_CHAR_CODE     code_point;
3271     GX_UBYTE last_canonical_class = 0;
3272     GX_UBYTE canonical_class;
3273     GX_UBYTE check;
3274     GX_STRING string_copy;
3275 
3276     *return_code = GX_NORMALIZATION_FORM_YES;
3277     string_copy = *string;
3278 
3279     while (string_copy.gx_string_length)
3280     {
3281         ret = _gx_utility_utf8_string_character_get(&string_copy, &code_point, GX_NULL);
3282 
3283         if ((ret != GX_SUCCESS) || (code_point == 0))
3284         {
3285             return GX_FAILURE;
3286         }
3287 
3288         gx_studio_canonical_combining_class_get(code_point, &canonical_class);
3289         if (last_canonical_class > canonical_class && canonical_class != 0)
3290         {
3291             *return_code = GX_NORMALIZATION_FORM_NO;
3292             break;
3293         }
3294 
3295         gx_studio_nfc_quick_check(code_point, &check);
3296 
3297         if ((check == GX_NORMALIZATION_FORM_NO) ||
3298             (check == GX_NORMALIZATION_FORM_MAYBE))
3299         {
3300             *return_code = check;
3301             break;
3302         }
3303 
3304         last_canonical_class = canonical_class;
3305     }
3306 
3307     return GX_SUCCESS;
3308 }
3309 
3310 /**************************************************************************/
3311 /*    This function converts utf-8 string to unicode list.                */
3312 /**************************************************************************/
gx_studio_canonical_utf8_to_unicode(GX_CANONICAL_CONTEXT * context,GX_CONST GX_STRING * string)3313 static UINT gx_studio_canonical_utf8_to_unicode(GX_CANONICAL_CONTEXT *context, GX_CONST GX_STRING *string)
3314 {
3315     GX_CHAR_CODE       code_point;
3316     UINT               ret;
3317     ULONG              code_count = 0;
3318     GX_STRING          string_copy = *string;
3319 
3320     while (string_copy.gx_string_length > 0)
3321     {
3322         ret = _gx_utility_utf8_string_character_get(&string_copy, &code_point, GX_NULL);
3323 
3324         if ((ret != GX_SUCCESS) || (code_point == 0))
3325         {
3326             return GX_FAILURE;
3327         }
3328 
3329         code_count++;
3330     }
3331 
3332     context->gx_canonical_context_code_list = new ULONG[code_count];
3333     if (!context->gx_canonical_context_code_list)
3334     {
3335         return GX_SYSTEM_MEMORY_ERROR;
3336     }
3337     context->gx_canonical_context_code_count = code_count;
3338 
3339     string_copy = *string;
3340 
3341     for (code_count = 0; code_count < context->gx_canonical_context_code_count; code_count++)
3342     {
3343         _gx_utility_utf8_string_character_get(&string_copy, &code_point, GX_NULL);
3344         context->gx_canonical_context_code_list[code_count] = code_point;
3345     }
3346 
3347     return GX_SUCCESS;
3348 }
3349 
3350 /**************************************************************************/
3351 /*    This function fully decomposes specified unicode list.              */
3352 /**************************************************************************/
gx_studio_unicode_canonical_decompress(GX_CANONICAL_CONTEXT * context,ULONG * code_list,UINT count,GX_BOOL testing)3353 static UINT gx_studio_unicode_canonical_decompress(GX_CANONICAL_CONTEXT *context, ULONG *code_list, UINT count, GX_BOOL testing)
3354 {
3355     UINT               code_point;
3356     ULONG              map[2];
3357     UINT               index;
3358     GX_CANONICAL_UNIT *unit;
3359 
3360     for (index = 0; index < count; index++)
3361     {
3362         code_point = code_list[index];
3363 
3364         gx_studio_canonical_decompress_map_get(code_point, map);
3365 
3366         if (map[0])
3367         {
3368             gx_studio_unicode_canonical_decompress(context, &map[0], 1, testing);
3369 
3370             if (map[1])
3371             {
3372                 gx_studio_unicode_canonical_decompress(context, &map[1], 1, testing);
3373             }
3374         }
3375         else
3376         {
3377             if (!testing)
3378             {
3379                 unit = &context->gx_canonical_context_unit_list[context->gx_canonical_context_unit_count];
3380                 unit->gx_canonical_unit_code_point = code_point;
3381                 gx_studio_canonical_combining_class_get(code_point, &unit->gx_canonical_unit_combining_class);
3382             }
3383 
3384             context->gx_canonical_context_unit_count++;
3385         }
3386     }
3387 
3388     return GX_SUCCESS;
3389 }
3390 
3391 /**************************************************************************/
3392 /*    This function fully decomposes the specified string.                */
3393 /**************************************************************************/
gx_studio_utf8_canonical_decompress(GX_CANONICAL_CONTEXT * context,GX_CONST GX_STRING * string)3394 static UINT gx_studio_utf8_canonical_decompress(GX_CANONICAL_CONTEXT *context, GX_CONST GX_STRING *string)
3395 {
3396     UINT status;
3397 
3398     /* Convert utf8 string to unicode string. */
3399     status = gx_studio_canonical_utf8_to_unicode(context, string);
3400 
3401     if (status == GX_SUCCESS)
3402     {
3403         /* Calculate the number of full decompressed unicode string. */
3404         status = gx_studio_unicode_canonical_decompress(context, context->gx_canonical_context_code_list, context->gx_canonical_context_code_count, GX_TRUE);
3405     }
3406 
3407     if (status == GX_SUCCESS)
3408     {
3409         context->gx_canonical_context_unit_list = new GX_CANONICAL_UNIT[context->gx_canonical_context_unit_count];
3410 
3411         if (!context->gx_canonical_context_unit_list)
3412         {
3413             status = GX_SYSTEM_MEMORY_ERROR;
3414         }
3415     }
3416 
3417     if (status == GX_SUCCESS)
3418     {
3419         context->gx_canonical_context_unit_count = 0;
3420 
3421         /* Process fully canonical decompress. */
3422         status = gx_studio_unicode_canonical_decompress(context, context->gx_canonical_context_code_list, context->gx_canonical_context_code_count, GX_FALSE);
3423     }
3424 
3425     return status;
3426 }
3427 
3428 /**************************************************************************/
3429 /*    This function sorts the specified code list by combining class in   */
3430 /*    ascending order.                                                    */
3431 /**************************************************************************/
gx_studio_canonical_combining_class_sort(GX_CANONICAL_CONTEXT * context,UINT start_index,UINT end_index)3432 static UINT gx_studio_canonical_combining_class_sort(GX_CANONICAL_CONTEXT *context, UINT start_index, UINT end_index)
3433 {
3434     UINT               index;
3435     GX_CANONICAL_UNIT  temp;
3436     GX_CANONICAL_UNIT *unit_a;
3437     GX_CANONICAL_UNIT *unit_b;
3438 
3439     while (start_index < end_index)
3440     {
3441         for (index = start_index; index < end_index; index++)
3442         {
3443             unit_a = &context->gx_canonical_context_unit_list[index];
3444             unit_b = &context->gx_canonical_context_unit_list[index + 1];
3445 
3446             if (unit_a->gx_canonical_unit_combining_class > unit_b->gx_canonical_unit_combining_class)
3447             {
3448                 /* swap reorderable pair. */
3449                 temp = *unit_a;
3450                 *unit_a = *unit_b;
3451                 *unit_b = temp;
3452             }
3453         }
3454 
3455         end_index--;
3456     }
3457 
3458     return GX_SUCCESS;
3459 }
3460 
3461 /**************************************************************************/
3462 /*    This function processes canonical ordering algorithm.               */
3463 /**************************************************************************/
gx_studio_canonical_ordering(GX_CANONICAL_CONTEXT * context)3464 static UINT gx_studio_canonical_ordering(GX_CANONICAL_CONTEXT *context)
3465 {
3466     UINT               index;
3467     GX_CANONICAL_UNIT *unit;
3468     INT                reorderable_count = 0;
3469 
3470     for (index = 0; index < context->gx_canonical_context_unit_count; index++)
3471     {
3472         unit = &context->gx_canonical_context_unit_list[index];
3473 
3474         if (unit->gx_canonical_unit_combining_class)
3475         {
3476             reorderable_count++;
3477         }
3478         else
3479         {
3480             if (reorderable_count)
3481             {
3482                 /* Reorder code point in ascending order. */
3483                 gx_studio_canonical_combining_class_sort(context, index - reorderable_count, index - 1);
3484             }
3485             reorderable_count = 0;
3486         }
3487     }
3488 
3489     if (reorderable_count)
3490     {
3491         /* Reorder code point in ascending order. */
3492         gx_studio_canonical_combining_class_sort(context, index - reorderable_count, index - 1);
3493     }
3494 
3495     return GX_SUCCESS;
3496 }
3497 
3498 /**************************************************************************/
3499 /*    This function searches decomposition sequence that is equivalent to */
3500 /*    a primary composite, and replace the decomposition sequence with    */
3501 /*    with the primary composition.                                       */
3502 /**************************************************************************/
gx_studio_canonical_equivalent_replace(GX_CANONICAL_CONTEXT * context,UINT C_index,UINT * L_index)3503 static UINT gx_studio_canonical_equivalent_replace(GX_CANONICAL_CONTEXT *context, UINT C_index, UINT *L_index)
3504 {
3505     UINT               index;
3506     GX_CANONICAL_UNIT *unit;
3507     GX_CANONICAL_UNIT *unit_C = &context->gx_canonical_context_unit_list[C_index];
3508     ULONG              replace_code;
3509 
3510     for (index = C_index - 1; index >= 0; index--)
3511     {
3512         unit = &context->gx_canonical_context_unit_list[index];
3513 
3514         if (unit->gx_canonical_unit_combining_class == 0)
3515         {
3516             /* Seek back in the coded character sequence from the character C to find the
3517             last starter L preceding C in the character sequence. */
3518             if (gx_studio_canonical_composed_code_get(unit->gx_canonical_unit_code_point,
3519                 unit_C->gx_canonical_unit_code_point,
3520                 &replace_code) == GX_SUCCESS)
3521             {
3522                 /* If there is such and L, and C is not blocked from L. */
3523                 if (gx_studio_full_composition_exclusion_test(replace_code) == GX_FALSE)
3524                 {
3525                     /* If exists a primary composite P which is canonically equivalent to the sequence <L, C>,
3526                     replace L by P in the sequence and delete C from the sequence. */
3527                     unit->gx_canonical_unit_code_point = replace_code;
3528                     if (C_index < context->gx_canonical_context_unit_count - 1)
3529                     {
3530                         memmove(context->gx_canonical_context_unit_list + C_index,
3531                             context->gx_canonical_context_unit_list + C_index + 1,
3532                             (context->gx_canonical_context_unit_count - C_index - 1) * sizeof(GX_CANONICAL_UNIT));
3533                     }
3534                     context->gx_canonical_context_unit_count--;
3535                     *L_index = index;
3536                     return GX_SUCCESS;
3537                 }
3538             }
3539             break;
3540         }
3541         else if (unit->gx_canonical_unit_combining_class >= unit_C->gx_canonical_unit_combining_class)
3542         {
3543             break;
3544         }
3545     }
3546 
3547     return GX_FAILURE;
3548 }
3549 
3550 /**************************************************************************/
3551 /*    This function processes canonical composition algorithm.            */
3552 /**************************************************************************/
gx_studio_canonical_compose(GX_CANONICAL_CONTEXT * context)3553 UINT gx_studio_canonical_compose(GX_CANONICAL_CONTEXT *context)
3554 {
3555     UINT               index;
3556     UINT               L_index;
3557     GX_CANONICAL_UNIT *unit;
3558 
3559     for (index = 1; index < context->gx_canonical_context_unit_count; index++)
3560     {
3561         /* Start from the second character in the coded character sequence and
3562         proceeding sequentially to the final character. */
3563         unit = &context->gx_canonical_context_unit_list[index];
3564 
3565         if (gx_studio_canonical_equivalent_replace(context, index, &L_index) == GX_SUCCESS)
3566         {
3567             index = L_index;
3568         }
3569     }
3570 
3571     return GX_SUCCESS;
3572 }
3573 
3574 /**************************************************************************/
3575 /*    This function encodes normalized code point with UTF-8.             */
3576 /**************************************************************************/
gx_studio_unicode_string_to_utf8_string(GX_CANONICAL_CONTEXT * context,GX_STRING * normalized_string)3577 static UINT gx_studio_unicode_string_to_utf8_string(GX_CANONICAL_CONTEXT *context, GX_STRING *normalized_string)
3578 {
3579     UINT      index;
3580     UINT      string_size = 0;
3581     UINT      glyph_len;
3582     GX_UBYTE  return_utf8_str[6];
3583     GX_UBYTE *utf8_str;
3584 
3585     /* Calculate utf8 string size. */
3586     for (index = 0; index < context->gx_canonical_context_unit_count; index++)
3587     {
3588         _gx_utility_unicode_to_utf8(context->gx_canonical_context_unit_list[index].gx_canonical_unit_code_point, return_utf8_str, &glyph_len);
3589         string_size += glyph_len;
3590     }
3591 
3592     utf8_str = new GX_UBYTE[string_size + 1];
3593     string_size = 0;
3594 
3595     for (index = 0; index < context->gx_canonical_context_unit_count; index++)
3596     {
3597         _gx_utility_unicode_to_utf8(context->gx_canonical_context_unit_list[index].gx_canonical_unit_code_point, utf8_str + string_size, &glyph_len);
3598         string_size += glyph_len;
3599     }
3600 
3601     utf8_str[string_size] = '\0';
3602 
3603     if (normalized_string)
3604     {
3605         normalized_string->gx_string_ptr = (GX_CONST GX_CHAR *)utf8_str;
3606         normalized_string->gx_string_length = string_size;
3607     }
3608 
3609     return GX_SUCCESS;
3610 }
3611 
3612 /**************************************************************************/
3613 /*    This function processes canonical composition after full canonical  */
3614 /*    decomposition.                                                      */
3615 /**************************************************************************/
gx_studio_canonical_normalize(GX_CONST GX_STRING * string,GX_STRING * normalized_string)3616 UINT gx_studio_canonical_normalize(GX_CONST GX_STRING *string, GX_STRING *normalized_string)
3617 {
3618     UINT                 status = GX_SUCCESS;
3619 
3620     GX_CANONICAL_CONTEXT context;
3621     GX_UBYTE             quick_check_result;
3622 
3623     memset(&context, 0, sizeof(GX_CANONICAL_CONTEXT));
3624 
3625     status = gx_studio_nfc_form_detect(string, &quick_check_result);
3626 
3627     if (status == GX_SUCCESS)
3628     {
3629         if (quick_check_result == GX_NORMALIZATION_FORM_YES)
3630         {
3631             /* already in normalized form. */
3632             return GX_NO_CHANGE;
3633         }
3634         /* Fully decompose the string. */
3635         status = gx_studio_utf8_canonical_decompress(&context, string);
3636     }
3637 
3638     if (status == GX_SUCCESS)
3639     {
3640         /* Process canonical ordering algorithm. */
3641         status = gx_studio_canonical_ordering(&context);
3642     }
3643 
3644     if (status == GX_SUCCESS)
3645     {
3646         /* Process canonical composition algorithm.*/
3647         status = gx_studio_canonical_compose(&context);
3648     }
3649 
3650     if (status == GX_SUCCESS)
3651     {
3652         /* Convert unicode to utf8 string. */
3653         status = gx_studio_unicode_string_to_utf8_string(&context, normalized_string);
3654     }
3655 
3656     if (context.gx_canonical_context_code_list)
3657     {
3658         delete []context.gx_canonical_context_code_list;
3659     }
3660 
3661     if (context.gx_canonical_context_unit_list)
3662     {
3663         delete []context.gx_canonical_context_unit_list;
3664     }
3665     return status;
3666 }
3667 
3668 
3669