diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 |
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 |
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /unicode | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'unicode')
38 files changed, 29041 insertions, 0 deletions
diff --git a/unicode/.gitignore b/unicode/.gitignore new file mode 100644 index 0000000..e34a996 --- /dev/null +++ b/unicode/.gitignore @@ -0,0 +1,7 @@ +/enttest +/graphemetest +/linebreaktest +/unicode_config.h +/unicode_config.h.in +/unicodetest +/wordbreaktest diff --git a/unicode/Makefile.am b/unicode/Makefile.am new file mode 100644 index 0000000..3d80d00 --- /dev/null +++ b/unicode/Makefile.am @@ -0,0 +1,169 @@ +# +# Copyright 2000-2011 Double Precision, Inc. See COPYING for +# distribution information. + + +noinst_SCRIPTS=update.sh \ + mkultcase.pl unicodefilter.pl \ + mkeastasianwidth.pl \ + mkgraphemebreak.pl mklinebreak.pl mkwordbreak.pl mkcommon.pm \ + mkhtmlent.pl + +noinst_PROGRAMS=unicodetest graphemetest linebreaktest wordbreaktest \ + enttest + +update-www: + @$(MAKE) update-www-unicode + @$(MAKE) update-www-eastasia + @$(MAKE) update-www-grapheme + @$(MAKE) update-www-linebreak + @$(MAKE) update-www-wordbreak + @$(MAKE) update-www-htmlent + +update-www-unicode: + @SHELL@ $(srcdir)/update.sh UnicodeData.txt http://www.unicode.org/Public/UNIDATA/UnicodeData.txt + +update-www-eastasia: + @SHELL@ $(srcdir)/update.sh Unihan-3.2.0.txt.gz http://www.unicode.org/Public/3.2-Update/Unihan-3.2.0.txt.gz + @SHELL@ $(srcdir)/update.sh EastAsianWidth.txt http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt + +update-www-grapheme: + @SHELL@ $(srcdir)/update.sh GraphemeBreakProperty.txt http://www.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt + +update-www-linebreak: + @SHELL@ $(srcdir)/update.sh LineBreak.txt http://www.unicode.org/Public/UNIDATA/LineBreak.txt + @SHELL@ $(srcdir)/update.sh LineBreakTest.txt http://www.unicode.org/Public/UNIDATA/auxiliary/LineBreakTest.txt + +update-www-wordbreak: + @SHELL@ $(srcdir)/update.sh WordBreakProperty.txt http://www.unicode.org/Public/UNIDATA/auxiliary/WordBreakProperty.txt + @SHELL@ $(srcdir)/update.sh WordBreakTest.txt http://www.unicode.org/Public/UNIDATA/auxiliary/WordBreakTest.txt + +update-www-htmlent: + @SHELL@ $(srcdir)/update.sh xhtml-lat1.ent http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent + @SHELL@ $(srcdir)/update.sh xhtml-symbol.ent http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent + @SHELL@ $(srcdir)/update.sh xhtml-special.ent http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent + +noinst_LTLIBRARIES=libunicode.la + +libunicode_la_SOURCES=unicode.h unicode.c unicodebuf.c \ + unicodecpp.C \ + unicode_ultcase.c \ + unicode_ultcasetab.c \ + unicode_wcwidth.c eastasianwidth.h \ + unicode_tablookup.c \ + unicode_graphemebreak.c graphemebreaktab.h \ + unicode_linebreak.c linebreaktab.h \ + unicode_htmlent.c unicode_htmlent.h \ + linebreaktab_internal.h \ + unicode_wordbreak.c wordbreaktab.h \ + wordbreaktab_internal.h + +EXTRA_DIST=$(noinst_SCRIPTS) + +if UPDATE_UNICODE + +unicode_ultcasetab.c: UnicodeData.txt mkultcase.pl + @PERL@ $(srcdir)/mkultcase.pl >unicode_ultcasetab.c + +eastasianwidth.h: EastAsianWidth.txt mkeastasianwidth.pl + @PERL@ $(srcdir)/mkeastasianwidth.pl >eastasianwidth.h + +graphemebreaktab.h: GraphemeBreakProperty.txt mkgraphemebreak.pl mkcommon.pm + @PERL@ $(srcdir)/mkgraphemebreak.pl >graphemebreaktab.h.tmp + mv graphemebreaktab.h.tmp graphemebreaktab.h + +linebreaktab.h: LineBreak.txt UnicodeData.txt mklinebreak.pl mkcommon.pm + @PERL@ $(srcdir)/mklinebreak.pl >linebreaktab.h.tmp + mv linebreaktab.h.tmp linebreaktab.h + +wordbreaktab.h: WordBreakProperty.txt mkwordbreak.pl mkcommon.pm + @PERL@ $(srcdir)/mkwordbreak.pl >wordbreaktab.h.tmp + mv wordbreaktab.h.tmp wordbreaktab.h + +unicode_htmlent.h: xhtml-lat1.ent xhtml-special.ent xhtml-symbol.ent mkhtmlent.pl + @PERL@ $(srcdir)/mkhtmlent.pl >unicode_htmlent.h.tmp + mv unicode_htmlent.h.tmp unicode_htmlent.h +endif + +unicodetest_SOURCES=unicodetest.c +unicodetest_DEPENDENCIES=libunicode.la +unicodetest_LDADD=libunicode.la +unicodetest_LDFLAGS=-static + +graphemetest_SOURCES=graphemetest.c +graphemetest_DEPENDENCIES=libunicode.la +graphemetest_LDADD=libunicode.la +graphemetest_LDFLAGS=-static + +linebreaktest_SOURCES=linebreaktest.C +linebreaktest_DEPENDENCIES=libunicode.la +linebreaktest_LDADD=libunicode.la +linebreaktest_LDFLAGS=-static + +wordbreaktest_SOURCES=wordbreaktest.C +wordbreaktest_DEPENDENCIES=libunicode.la +wordbreaktest_LDADD=libunicode.la +wordbreaktest_LDFLAGS=-static + +enttest_SOURCES=enttest.c +enttest_DEPENDENCIES=libunicode.la +enttest_LDADD=libunicode.la +enttest_LDFLAGS=-static + +check-am: unicodetest + ./unicodetest + ./enttest + test -f ./LineBreakTest.txt || exit 0; ./linebreaktest + test "`./unicodetest foo`" = "foo" + test "`./unicodetest 'foo&bar.~'`" = "foo&-bar.~" + test "`./unicodetest 'foobаr'`" = "foob&BDA-r" + test "`./unicodetest 'foobааr'`" = "foob&BDAEMA-r" + test "`./unicodetest 'foobаааr'`" = "foob&BDAEMAQw-r" + test "`./unicodetest 'foobааааr'`" = "foob&BDAEMAQwBDA-r" + test "`./unicodetest 'foobаааааr'`" = "foob&BDAEMAQwBDAEMA-r" + test "`./unicodetest 'foobааааааr'`" = "foob&BDAEMAQwBDAEMAQw-r" + test "`./unicodetest 'foobаaаr'`" = "foob&BDA-a&BDA-r" + test "`./unicodetest 'foobааaааr'`" = "foob&BDAEMA-a&BDAEMA-r" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; n="`echo $$n | cut -c1-1023`"; test "`./unicodetest $$n`" = "$$n" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; test "`./unicodetest $$n`" = "$$n" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; test "`./unicodetest a$$n`" = "a$$n" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; n="`echo $$n | cut -c1-1023`"; test "`./unicodetest $$n'&'`" = "$$n""&-" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; test "`./unicodetest $$n'&'`" = "$$n""&-" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; test "`./unicodetest $$n'a&'`" = "$$n""a&-" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; test "`./unicodetest $$n'a&a'`" = "$$n""a&-a" + n="aaaaaaaa"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n$$n$$n"; n="$$n$$n"; n="`echo $$n | cut -c1-1023`"; test "`./unicodetest $$n'а'`" = "$$n""&BDA-" + test "`./unicodetest --smap foo`" = "foo" + test "`./unicodetest --smap 'foo&bar'`" = 'foo&-bar' + test "`./unicodetest --smap 'foo.bar'`" = 'foo&AC4-bar' + test "`./unicodetest --totitle 'tÄst'`" = 'Täst' + test "`./graphemetest 0x0d 0x0a`" = "0" + test "`./graphemetest 0x0d 0x41`" = "1" + test "`./graphemetest 0x41 0x0d`" = "1" + test "`./graphemetest 0x0a 0x41`" = "1" + test "`./graphemetest 0x41 0x0a`" = "1" + test "`./graphemetest 0x09 0x41`" = "1" + test "`./graphemetest 0x41 0x09`" = "1" + test "`./graphemetest 0x1100 0x1101`" = "0" + test "`./graphemetest 0x1100 0x1160`" = "0" + test "`./graphemetest 0xAC00 0x1160`" = "0" + test "`./graphemetest 0xAC02 0xD7FB`" = "0" + test "`./graphemetest 0xD7FB 0xD7FB`" = "0" + test "`./graphemetest 0x0041 0x1101`" = "1" + test "`./graphemetest 0x0041 0x1160`" = "1" + test "`./graphemetest 0x0041 0x1160`" = "1" + test "`./graphemetest 0x0041 0xD7FB`" = "1" + test "`./graphemetest 0x0041 0xD7FB`" = "1" + test "`./graphemetest 0x1100 0x0041`" = "1" + test "`./graphemetest 0x1100 0x0041`" = "1" + test "`./graphemetest 0xAC00 0x0041`" = "1" + test "`./graphemetest 0xAC02 0x0041`" = "1" + test "`./graphemetest 0xD7FB 0x0041`" = "1" + test "`./graphemetest 0x0041 0x036F`" = "0" + test "`./graphemetest 0x0041 0x0903`" = "0" + test "`./graphemetest 0x0041 0xAABB`" = "1" + test "`./graphemetest 0x036F 0x0041`" = "1" + test "`./graphemetest 0x0903 0x0041`" = "1" + test "`./graphemetest 0xAABB 0x0041`" = "0" + test "`./graphemetest 0x0041 0x0041`" = "1" + + diff --git a/unicode/README b/unicode/README new file mode 100644 index 0000000..3112508 --- /dev/null +++ b/unicode/README @@ -0,0 +1,49 @@ + +HOW TO ADD A NEW CHARACTER SET MAPPING. + + * Create a struct unicode_info structure. This structure defines the + official character set name, as well as pointers to conversion functions. + + * Add the name of the character set, and the name of your structure to + unicode/charsetlist.txt. Multiple entries in unicode/charsetlist.txt can + be used to define aliases for the same character set. Example - "IBM869" + and "CP869" both specify the same character set, they both point to the + unicode_IBM_869 object, which is defined in ibm869.c + + There's an automatically generated source file, charsetlist.c, which is + generated by a script from charsetlist.txt. That's how character sets end up + being linked into the code, and how individual character sets can be + selectively included or excluded. + + The struct unicode_info structure contains pointers to the following + functions: + + + Convert text in this character set to unicode. + + + Convert unicode to text in this character set. + + + Convert text in this character set to uppercase. + + + Convert text in this character set to lowercase. + + + Convert text in this character set to titlecase. + + If the character set allows for convenient conversion to + upper/lower/titlecase, the conversion code should be coded directly. + Otherwise, the library has a set of convenient functions that go against + the unicode master table. Text in any character set can + upper/lower/titlecased by converting it to unicode, running it through + unicode_uc/unicode_lc/unicode_tc, then converting unicode back to the + original character set. See utf8_chset.c for an example. + + Note that unicode_uc/unicode_lc/unicode_tc carries a heavy penalty, and + should be avoided. unicode_[ult]c() adds about 26Kb of data tables. + + Finally, all this code has to be added to libunicode.a. It can simply be + added to libunicode_a_SOURCES. + + If, after doing all that, run make to build libunicode.a and the + unicode-info program. Run unicode-info. If the character set is listed by + unicode-info, you should be all set, provided that the conversion functions + actually work as advertised. + diff --git a/unicode/cjkcompat.pl b/unicode/cjkcompat.pl new file mode 100644 index 0000000..642a75e --- /dev/null +++ b/unicode/cjkcompat.pl @@ -0,0 +1,649 @@ +## +## Maps for compatibility ideographs. +## + +# Some standards have separated Uniocde maps for same ideographs +# by each specific reasons. Those separations are not meaningful +# for other standards. So they must be unified. +# cf. Unicode Standard. + +## CJK Compatibility Ideographs (U+F900 - U+FAFF) + +# Pronounciation variants from KS X 1001:1998 +%compat_ksx1001 = ( + # 42-25 ga + 0xF903 => 0x8CC8, # 45-47 go + # 43-29 gang + 0xFA09 => 0x964D, # 90-02 hang + # 49-34 gi + 0xF900 => 0x8C48, # 43-48 gae + # 44-58 gyeong + 0xF901 => 0x66F4, # 43-54 gaeng + # 83-19 ca + 0xF902 => 0x8ECA, # 43-71 geo + # 44-24 gyeon + 0xFA0A => 0x898B, # 90-70 hyeon + # 44-88 gye + 0xF909 => 0x5951, # 48-48 geul + # 92-33 hwal + 0xF904 => 0x6ED1, # 45-72 gol + # 45-90 goj + 0xF905 => 0x4E32, # 46-13 gwan + # 46-09 gwag + 0xFA0B => 0x5ED3, # 92-09 hwag + # 47-03 gu + 0xF906 => 0x53E5, # 47-91 gwi + # 47-47 gu + 0xF907 => 0x9F9C, # 48-02 gwi + 0xF908 => 0x9F9C, # 48-24 gyun + # 49-49 gim + 0xF90A => 0x91D1, # 48-61 geum + # 52-90 ra + 0xF90B => 0x5587, # 49-52 na + # 50-15 nae + 0xF90C => 0x5948, # 49-53 na + # 52-91 ra + 0xF90D => 0x61F6, # 49-56 na + # 49-57 na + 0xF95B => 0x62CF, # 52-92 ra + # 52-93 ra + 0xF90E => 0x7669, # 49-59 na + # 52-94 ra + 0xF90F => 0x7F85, # 49-60 na + # 53-01 ra + 0xF910 => 0x863F, # 49-61 na + # 53-02 ra + 0xF911 => 0x87BA, # 49-62 na + # 53-03 ra + 0xF912 => 0x88F8, # 49-63 na + # 53-04 ra + 0xF913 => 0x908F, # 49-64 na + # 68-37 ag + 0xF914 => 0x6A02, # 49-66 nag + 0xF95C => 0x6A02, # 53-05 rag + 0xF9BF => 0x6A02, # 72-89 yo + # 53-06 rag + 0xF915 => 0x6D1B, # 49-67 nag + # 53-07 rag + 0xF916 => 0x70D9, # 49-68 nag + # 53-08 rag + 0xF917 => 0x73DE, # 49-69 nag + # 53-10 rag + 0xF918 => 0x843D, # 49-70 nag + # 49-71 nag + 0xF95D => 0x8AFE, # 53-11 rag + # 53-12 rag + 0xF919 => 0x916A, # 49-72 nag + # 53-13 rag + 0xF91A => 0x99F1, # 49-73 nag + # 53-15 ran + 0xF91B => 0x4E82, # 49-74 nan + # 53-16 ran + 0xF91C => 0x5375, # 49-75 nan + # 53-17 ran + 0xF91D => 0x6B04, # 49-77 nan + # 53-20 ran + 0xF91E => 0x721B, # 49-79 nan + # 53-21 ran + 0xF91F => 0x862D, # 49-80 nan + # 53-22 ran + 0xF920 => 0x9E1E, # 49-82 nan + # 53-25 ram + 0xF921 => 0x5D50, # 49-86 nam + # 53-29 ram + 0xF922 => 0x6FEB, # 49-90 nam + # 53-32 ram + 0xF923 => 0x85CD, # 49-92 nam + # 53-33 ram + 0xF924 => 0x8964, # 49-93 nam + # 53-35 rab + 0xF925 => 0x62C9, # 49-94 nab + # 53-36 rab + 0xF926 => 0x81D8, # 50-02 nab + # 53-37 rab + 0xF927 => 0x881F, # 50-03 nab + # 53-38 rang + 0xF928 => 0x5ECA, # 50-07 nang + # 53-39 rang + 0xF929 => 0x6717, # 50-08 nang + # 53-40 rang + 0xF92A => 0x6D6A, # 50-09 nang + # 53-41 rang + 0xF92B => 0x72FC, # 50-10 nang + # 53-45 rang + 0xF92C => 0x90DE, # 50-11 nang + # 53-46 rae + 0xF92D => 0x4F86, # 50-13 nae + # 53-50 raeng + 0xF92E => 0x51B7, # 50-18 naeng + # 50-19 nyeo + 0xF981 => 0x5973, # 69-92 yeo + # 50-20 nyeon + 0xF98E => 0x5E74, # 70-36 yeon + # 50-21 nyeon + 0xF991 => 0x649A, # 70-42 yeon + # 50-22 nyeon + 0xF995 => 0x79CA, # 70-60 yeon + # 50-23 nyeom + 0xF9A3 => 0x5FF5, # 70-86 yeom + # 50-26 nyeom + 0xF9A4 => 0x637B, # 70-87 yeom + # 50-27 nyeong + 0xF95F => 0x5BE7, # 54-24 ryeong + 0xF9AA => 0x5BE7, # 71-12 yeong + # 54-44 ro + 0xF92F => 0x52DE, # 50-30 no + # 50-33 no + 0xF960 => 0x6012, # 54-45 ro + # 54-47 ro + 0xF930 => 0x64C4, # 50-34 no + # 54-48 ro + 0xF931 => 0x6AD3, # 50-35 no + # 54-51 ro + 0xF932 => 0x7210, # 50-36 no + # 54-52 ro + 0xF933 => 0x76E7, # 50-38 no + # 54-53 ro + 0xF934 => 0x8001, # 50-39 no + # 54-54 ro + 0xF935 => 0x8606, # 50-40 no + # 54-55 ro + 0xF936 => 0x865C, # 50-41 no + # 54-56 ro + 0xF937 => 0x8DEF, # 50-42 no + # 54-58 ro + 0xF938 => 0x9732, # 50-43 no + # 54-59 ro + 0xF939 => 0x9B6F, # 50-45 no + # 54-60 ro + 0xF93A => 0x9DFA, # 50-46 no + # 54-62 rog + 0xF93B => 0x788C, # 50-47 nog + # 54-63 rog + 0xF93C => 0x797F, # 50-48 nog + # 54-64 rog + 0xF93D => 0x7DA0, # 50-49 nog + # 54-65 rog + 0xF93E => 0x83C9, # 50-50 nog + # 54-66 rog + 0xF93F => 0x9304, # 50-51 nog + # 54-67 rog + 0xF940 => 0x9E7F, # 50-52 nog + # 54-69 ron + 0xF941 => 0x8AD6, # 50-53 non + # 54-70 rong + 0xF942 => 0x58DF, # 50-54 nong + # 54-71 rong + 0xF943 => 0x5F04, # 50-55 nong + # 54-75 rong + 0xF944 => 0x7C60, # 50-57 nong + # 54-76 rong + 0xF945 => 0x807E, # 50-58 nong + # 54-79 roe + 0xF946 => 0x7262, # 50-62 noe + # 54-80 roe + 0xF947 => 0x78CA, # 50-63 noe + # 54-81 roe + 0xF948 => 0x8CC2, # 50-65 noe + # 54-84 roe + 0xF949 => 0x96F7, # 50-66 noe + # 50-67 nyo + 0xF9BD => 0x5C3F, # 72-81 yo + # 55-04 ru + 0xF94A => 0x58D8, # 50-68 nu + # 55-06 ru + 0xF94B => 0x5C62, # 50-69 nu + # 55-07 ru + 0xF94C => 0x6A13, # 50-70 nu + # 55-08 ru + 0xF94D => 0x6DDA, # 50-71 nu + # 55-09 ru + 0xF94E => 0x6F0F, # 50-72 nu + # 55-11 ru + 0xF94F => 0x7D2F, # 50-73 nu + # 55-12 ru + 0xF950 => 0x7E37, # 50-74 nu + # 55-16 ru + 0xF951 => 0x964B, # 50-75 nu + # 50-78 nyu + 0xF9C8 => 0x677B, # 74-84 yu + # 50-79 nyu + 0xF9CF => 0x7D10, # 75-10 yu + # 55-45 reug + 0xF952 => 0x52D2, # 50-80 neug + # 55-46 reug + 0xF953 => 0x808B, # 50-81 neug + # 55-47 reum + 0xF954 => 0x51DC, # 50-82 neum + # 55-48 reung + 0xF955 => 0x51CC, # 50-83 neung + # 55-50 reung + 0xF956 => 0x7A1C, # 50-84 neung + # 55-51 reung + 0xF957 => 0x7DBE, # 50-85 neung + # 55-52 reung + 0xF958 => 0x83F1, # 50-87 neung + # 55-53 reung + 0xF959 => 0x9675, # 50-88 neung + # 50-90 ni + 0xF9E3 => 0x6CE5, # 76-18 i + # 50-91 nig + 0xF9EB => 0x533F, # 76-41 ig + # 50-92 nig + 0xF9EC => 0x6EBA, # 76-42 ig + # 50-94 da + 0xF9FE => 0x8336, # 83-17 ca + # 51-01 dan + 0xF95E => 0x4E39, # 53-14 ran + # 51-56 dang + 0xFA03 => 0x7CD6, # 87-24 tang + # 51-75 daeg + 0xFA04 => 0x5B85, # 87-40 taeg + # 51-88 do + 0xFA01 => 0x5EA6, # 86-84 tag + # 52-33 dog + 0xF95A => 0x8B80, # 52-70 du + # 52-55 dong + 0xFA05 => 0x6D1E, # 87-51 tong + # 53-51 ryag + 0xF975 => 0x63A0, # 69-17 yag + # 53-52 ryag + 0xF976 => 0x7565, # 69-18 yag + # 53-53 ryang + 0xF977 => 0x4EAE, # 69-25 yang + # 53-55 ryang + 0xF978 => 0x5169, # 69-27 yang + # 53-56 ryang + 0xF979 => 0x51C9, # 69-28 yang + # 53-57 ryang + 0xF97A => 0x6881, # 69-36 yang + # 53-61 ryang + 0xF97B => 0x7CE7, # 69-46 yang + # 53-62 ryang + 0xF97C => 0x826F, # 69-48 yang + # 53-63 ryang + 0xF97D => 0x8AD2, # 69-50 yang + # 53-65 ryang + 0xF97E => 0x91CF, # 69-54 yang + # 53-68 ryeo + 0xF97F => 0x52F5, # 69-90 yeo + # 53-69 ryeo + 0xF980 => 0x5442, # 69-91 yeo + # 53-70 ryeo + 0xF982 => 0x5EEC, # 69-94 yeo + # 53-73 ryeo + 0xF983 => 0x65C5, # 70-01 yeo + # 53-75 ryeo + 0xF984 => 0x6FFE, # 70-04 yeo + # 53-76 ryeo + 0xF985 => 0x792A, # 70-07 yeo + # 53-79 ryeo + 0xF986 => 0x95AD, # 70-13 yeo + # 53-81 ryeo + 0xF987 => 0x9A6A, # 70-15 yeo + # 53-82 ryeo + 0xF988 => 0x9E97, # 70-16 yeo + # 53-83 ryeo + 0xF989 => 0x9ECE, # 70-17 yeo + # 53-84 ryeog + 0xF98A => 0x529B, # 70-19 yeog + # 53-85 ryeog + 0xF98B => 0x66C6, # 70-23 yeog + # 53-86 ryeog + 0xF98C => 0x6B77, # 70-24 yeog + # 53-89 ryeog + 0xF98D => 0x8F62, # 70-28 yeog + # 53-91 ryeon + 0xF98F => 0x6190, # 70-38 yeon + # 53-92 ryeon + 0xF990 => 0x6200, # 70-39 yeon + # 53-94 ryeon + 0xF992 => 0x6F23, # 70-50 yeon + # 54-01 ryeon + 0xF993 => 0x7149, # 70-54 yeon + # 54-02 ryeon + 0xF994 => 0x7489, # 70-57 yeon + # 54-03 ryeon + 0xF996 => 0x7DF4, # 70-63 yeon + # 54-04 ryeon + 0xF997 => 0x806F, # 70-65 yeon + # 54-05 ryeon + 0xF999 => 0x84EE, # 70-69 yeon + # 54-06 ryeon + 0xF998 => 0x8F26, # 70-68 yeon + # 54-07 ryeon + 0xF99A => 0x9023, # 70-70 yeon + # 54-08 ryeon + 0xF99B => 0x934A, # 70-72 yeon + # 54-10 ryeol + 0xF99C => 0x5217, # 70-74 yeol + # 54-11 ryeol + 0xF99D => 0x52A3, # 70-75 yeol + # 54-13 ryeol + 0xF99F => 0x70C8, # 70-79 yeol + # 54-14 ryeol + 0xF9A0 => 0x88C2, # 70-81 yeol + # 54-15 ryeom + 0xF9A2 => 0x5EC9, # 70-85 yeom + # 54-17 ryeom + 0xF9A5 => 0x6BAE, # 70-89 yeom + # 54-19 ryeom + 0xF9A6 => 0x7C3E, # 71-01 yeom + # 54-20 ryeob + 0xF9A7 => 0x7375, # 71-06 yeob + # 54-21 ryeong + 0xF9A8 => 0x4EE4, # 71-09 yeong + # 54-23 ryeong + 0xF9A9 => 0x56F9, # 71-10 yeong + # 54-26 ryeong + 0xF9AB => 0x5DBA, # 71-13 yeong + # 54-27 ryeong + 0xF9AC => 0x601C, # 71-16 yeong + # 54-28 ryeong + 0xF9AD => 0x73B2, # 71-31 yeong + # 54-30 ryeong + 0xF9AF => 0x7F9A, # 71-38 yeong + # 54-32 ryeong + 0xF9B0 => 0x8046, # 71-39 yeong + # 54-34 ryeong + 0xF9B1 => 0x9234, # 71-43 yeong + # 54-35 ryeong + 0xF9B2 => 0x96F6, # 71-45 yeong + # 54-36 ryeong + 0xF9B3 => 0x9748, # 71-47 yeong + # 54-37 ryeong + 0xF9B4 => 0x9818, # 71-48 yeong + # 54-39 rye + 0xF9B5 => 0x4F8B, # 71-51 ye + # 54-41 rye + 0xF9B6 => 0x79AE, # 71-63 ye + # 54-42 rye + 0xF9B7 => 0x91B4, # 71-68 ye + # 54-43 rye + 0xF9B8 => 0x96B7, # 71-70 ye + # 54-85 ryo + 0xF9BA => 0x4E86, # 72-71 yo + # 54-86 ryo + 0xF9BB => 0x50DA, # 72-72 yo + # 54-87 ryo + 0xF9BC => 0x5BEE, # 72-80 yo + # 54-89 ryo + 0xF9BE => 0x6599, # 72-87 yo + # 54-90 ryo + 0xF9C0 => 0x71CE, # 72-91 yo + # 54-91 ryo + 0xF9C1 => 0x7642, # 72-94 yo + # 54-94 ryo + 0xF9C2 => 0x84FC, # 73-07 yo + # 55-01 ryo + 0xF9C3 => 0x907C, # 73-12 yo + # 55-03 ryong + 0xF9C4 => 0x9F8D, # 73-44 yong + # 55-17 ryu + 0xF9C7 => 0x5289, # 74-69 yu + # 55-19 ryu + 0xF9C9 => 0x67F3, # 74-87 yu + # 55-21 ryu + 0xF9CA => 0x6D41, # 74-92 yu + # 55-22 ryu + 0xF9CB => 0x6E9C, # 74-94 yu + # 55-24 ryu + 0xF9CC => 0x7409, # 75-04 yu + # 55-26 ryu + 0xF9CD => 0x7559, # 75-07 yu + # 55-28 ryu + 0xF9CE => 0x786B, # 75-09 yu + # 55-30 ryu + 0xF9D0 => 0x985E, # 75-26 yu + # 55-31 ryug + 0xF9D1 => 0x516D, # 75-27 yug + # 55-32 ryug + 0xF9D2 => 0x622E, # 75-29 yug + # 55-33 ryug + 0xF9D3 => 0x9678, # 75-33 yug + # 55-35 ryun + 0xF9D4 => 0x502B, # 75-34 yun + # 55-36 ryun + 0xF9D5 => 0x5D19, # 75-38 yun + # 55-37 ryun + 0xF9D6 => 0x6DEA, # 75-39 yun + # 55-39 ryun + 0xF9D7 => 0x8F2A, # 75-44 yun + # 55-40 ryul + 0xF9D8 => 0x5F8B, # 75-47 yul + # 55-41 ryul + 0xF9D9 => 0x6144, # 75-48 yul + # 55-42 ryul + 0xF9DA => 0x6817, # 75-49 yul + # 65-67 sol + 0xF961 => 0x7387, # 55-43 ryul + 0xF9DB => 0x7387, # 75-50 yul + # 55-44 ryung + 0xF9DC => 0x9686, # 75-56 yung + # 55-55 ri + 0xF9DD => 0x5229, # 76-06 i + # 55-57 ri + 0xF9DE => 0x540F, # 76-07 i + # 55-59 ri + 0xF9DF => 0x5C65, # 76-10 i + # 55-61 ri + 0xF9E1 => 0x674E, # 76-16 i + # 55-62 ri + 0xF9E2 => 0x68A8, # 76-17 i + # 55-66 ri + 0xF9E4 => 0x7406, # 76-21 i + # 76-22 i + 0xF962 => 0x7570, # 55-68 ri + # 55-69 ri + 0xF9E5 => 0x75E2, # 76-24 i + # 55-71 ri + 0xF9E6 => 0x7F79, # 76-26 i + # 55-74 ri + 0xF9E7 => 0x88CF, # 76-32 i + # 55-75 ri + 0xF9E8 => 0x88E1, # 76-33 i + # 55-76 ri + 0xF9E9 => 0x91CC, # 76-37 i + # 55-78 ri + 0xF9EA => 0x96E2, # 76-38 i + # 55-80 rin + 0xF9ED => 0x541D, # 76-53 in + # 55-82 rin + 0xF9EE => 0x71D0, # 76-61 in + # 55-83 rin + 0xF9EF => 0x7498, # 76-62 in + # 55-84 rin + 0xF9F0 => 0x85FA, # 76-65 in + # 55-86 rin + 0xF9F1 => 0x96A3, # 76-68 in + # 55-87 rin + 0xF9F2 => 0x9C57, # 76-71 in + # 55-88 rin + 0xF9F3 => 0x9E9F, # 76-72 in + # 55-89 rim + 0xF9F4 => 0x6797, # 76-87 im + # 55-90 rim + 0xF9F5 => 0x6DCB, # 76-88 im + # 55-92 rim + 0xF9F6 => 0x81E8, # 76-90 im + # 56-01 rib + 0xF9F7 => 0x7ACB, # 77-01 ib + # 56-02 rib + 0xF9F8 => 0x7B20, # 77-02 ib + # 56-03 rib + 0xF9F9 => 0x7C92, # 77-03 ib + # 58-82 ban + 0xF964 => 0x78FB, # 59-68 beon + # 61-33 bug + 0xF963 => 0x5317, # 59-37 bae + # 88-21 pyeon + 0xF965 => 0x4FBF, # 60-05 byeon + # 60-54 bog + 0xF966 => 0x5FA9, # 61-05 bu + # 60-63 bog + 0xFA07 => 0x8F3B, # 88-80 pog + # 60-84 bu + 0xF967 => 0x4E0D, # 61-53 bul + # 89-18 pil + 0xF968 => 0x6CCC, # 61-84 bi + # 66-06 su + 0xF969 => 0x6578, # 62-92 sag + # 63-67 saeg + 0xF96A => 0x7D22, # 62-94 sag + # 63-15 sal + 0xF970 => 0x6BBA, # 65-77 swae + # 83-49 cam + 0xF96B => 0x53C3, # 63-19 sam + # 63-50 sang + 0xF9FA => 0x72C0, # 77-78 jang + # 63-61 sae + 0xF96C => 0x585E, # 63-65 saeg + # 64-93 seong + 0xF96D => 0x7701, # 63-72 saeng + # 64-67 seol + 0xF96F => 0x8AAA, # 65-13 se + 0xF9A1 => 0x8AAA, # 70-82 yeol + # 71-08 yeob + 0xF96E => 0x8449, # 64-81 seob + # 67-06 seub + 0xF973 => 0x62FE, # 68-09 sib + # 67-59 sig + 0xF9FC => 0x8B58, # 82-29 ji + # 82-67 jin + 0xF971 => 0x8FB0, # 67-85 sin + # 86-56 cim + 0xF972 => 0x6C88, # 68-01 sim + # 68-07 sib + 0xF9FD => 0x4EC0, # 82-90 jib + # 68-34 ag + 0xF9B9 => 0x60E1, # 71-87 o + # 69-20 yag + 0xF974 => 0x82E5, # 69-14 ya + # 70-22 yeog + 0xF9E0 => 0x6613, # 76-15 i + # 76-54 in + 0xF99E => 0x54BD, # 70-76 yeol + # 91-09 hyeong + 0xF9AE => 0x7469, # 71-33 yeong + # 72-54 wan + 0xF9C6 => 0x962E, # 74-33 weon + # 93-27 hun + 0xF9C5 => 0x6688, # 73-87 un + # 77-09 ja + 0xF9FF => 0x523A, # 84-07 ceog + # 77-19 ja + 0xF9FB => 0x7099, # 78-59 jeog + # 79-23 jeol + 0xFA00 => 0x5207, # 84-78 ce + # 84-12 ceog + 0xFA02 => 0x62D3, # 86-86 tag + # 88-76 pog + 0xFA06 => 0x66B4, # 88-59 po + # 90-28 haeng + 0xFA08 => 0x884C, # 90-01 hang +); + +# Duplicates from Big 5 +%compat_big5 = ( + 0xFA0C => 0x5140, + 0xFA0D => 0x55C0, +); + +# The IBM 32 compatibility ideograph +%compat_ibm32 = ( + 0xFA10 => 0x585A, + 0xFA12 => 0x6674, + 0xFA15 => 0x51DE, + 0xFA16 => 0x732A, + 0xFA17 => 0x76CA, + 0xFA18 => 0x793C, + 0xFA19 => 0x795E, + 0xFA1A => 0x7965, + 0xFA1B => 0x798F, + 0xFA1C => 0x9756, + 0xFA1D => 0x7CBE, + 0xFA1E => 0x7FBD, + 0xFA20 => 0x8612, + 0xFA22 => 0x8AF8, + 0xFA25 => 0x9038, + 0xFA26 => 0x90FD, + 0xFA2A => 0x98EF, + 0xFA2B => 0x98FC, + 0xFA2C => 0x9928, + 0xFA2D => 0x9DB4, + +); + +# JIS X 0213 compatibility additions +%compat_jisx0213 = ( + 0xFA30 => 0x4FAE, + 0xFA31 => 0x50E7, + 0xFA32 => 0x514D, + 0xFA33 => 0x52C9, + 0xFA34 => 0x52E4, + 0xFA35 => 0x5351, + 0xFA36 => 0x559D, + 0xFA37 => 0x5606, + 0xFA38 => 0x5668, + 0xFA39 => 0x5840, + 0xFA3A => 0x58A8, + 0xFA3B => 0x5C64, + 0xFA3C => 0x5C6E, + 0xFA3D => 0x6094, + 0xFA3E => 0x6168, + 0xFA3F => 0x618E, + 0xFA40 => 0x61F2, + 0xFA41 => 0x654F, + 0xFA42 => 0x65E2, + 0xFA43 => 0x6691, + 0xFA44 => 0x6885, + 0xFA45 => 0x6D77, + 0xFA46 => 0x6E1A, + 0xFA47 => 0x6F22, + 0xFA48 => 0x716E, + 0xFA49 => 0x722B, + 0xFA4A => 0x7422, + 0xFA4B => 0x7891, + 0xFA4C => 0x793E, + 0xFA4D => 0x7949, + 0xFA4E => 0x7948, + 0xFA4F => 0x7950, + 0xFA50 => 0x7956, + 0xFA51 => 0x795D, + 0xFA52 => 0x798D, + 0xFA53 => 0x798E, + 0xFA54 => 0x7A40, + 0xFA55 => 0x7A81, + 0xFA56 => 0x7BC0, + 0xFA57 => 0x7DF4, + 0xFA58 => 0x7E09, + 0xFA59 => 0x7E41, + 0xFA5A => 0x7F72, + 0xFA5B => 0x8005, + 0xFA5C => 0x81ED, + 0xFA5D => 0x8279, + 0xFA5E => 0x8279, + 0xFA5F => 0x8457, + 0xFA60 => 0x8910, + 0xFA61 => 0x8996, + 0xFA62 => 0x8B01, + 0xFA63 => 0x8B39, + 0xFA64 => 0x8CD3, + 0xFA65 => 0x8D08, + 0xFA66 => 0x8FB6, + 0xFA67 => 0x9038, + 0xFA68 => 0x96E3, + 0xFA69 => 0x97FF, + 0xFA6A => 0x983B, +); + +## CJK Compatibility Ideographs Supplement (U+2F800 - U+2FA1F) + +# Duplicate characters from CNS 11643-1992 +%compat_cns11643 = ( + # By now we don't support CNS 11643. +); + + +1; + diff --git a/unicode/configure.in b/unicode/configure.in new file mode 100644 index 0000000..a8adc78 --- /dev/null +++ b/unicode/configure.in @@ -0,0 +1,83 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(unicode, 0.10, [courier-maildrop@lists.sourceforge.net]) + +>confdefs.h # Kill PACKAGE_ macros + +AC_CONFIG_SRCDIR(unicodecpp.C) +AC_CONFIG_AUX_DIR(../..) + +LPATH="$PATH:/usr/local/bin" + +AM_CONFIG_HEADER(unicode_config.h) +AM_INIT_AUTOMAKE([foreign no-define]) +dnl Checks for programs. + +AC_PROG_MAKE_SET +AM_PROG_LIBTOOL +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_CC +AC_PROG_CXX +AC_PATH_PROGS(PERL, perl5 perl, perl, $LPATH) + +if test "$PERL" = "perl" +then + AC_MSG_ERROR(Perl not found.) +fi + +dnl Checks for libraries. + +dnl Checks for header files. + +AC_CHECK_HEADERS(stddef.h wchar.h locale.h) + +dnl Checks for typedefs, structures, and compiler characteristics. + +dnl Checks for library functions. + +AC_CHECK_FUNCS(setlocale) + +AM_CONDITIONAL(UPDATE_UNICODE, test -f ${srcdir}/UnicodeData.txt) + +AC_SYS_LARGEFILE + +AC_C_BIGENDIAN + +AC_MSG_CHECKING([whether libcharset is used]) +AC_ARG_WITH(libcharset, + [ --with-libcharset Use the libcharset library], + unicode_with_libcharset=$withval, + unicode_with_libcharset=no) +AC_MSG_RESULT($unicode_with_libcharset) +if test "$unicode_with_libcharset" = "yes"; then + AC_CHECK_LIB(charset,locale_charset) + if test "$ac_cv_lib_charset_locale_charset" = "yes"; then + AC_CHECK_HEADERS(localcharset.h libcharset.h) + else + AC_MSG_ERROR([libcharset was not found. Install libcharset package.]) + fi + AC_DEFINE_UNQUOTED(UNICODE_USE_LIBCHARSET, 1, + [ Set this to 1 to use libcharset library. ]) +else + AM_LANGINFO_CODESET +fi + +save_LIBS="$LIBS" + +LIBS="$LIBS -liconv" + +AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <iconv.h> +],[ + +iconv_open("",""); +])] ,[ : ], [LIBS="$save_LIBS"]) + +if test "$GCC" = "yes" +then + CFLAGS="$CFLAGS -Wall -fexceptions" +fi +CFLAGS="-I.. -I$srcdir/.. $CFLAGS" +CXXFLAGS="-I.. -I$srcdir/.. $CXXFLAGS" +AC_OUTPUT(Makefile) diff --git a/unicode/eastasianwidth.h b/unicode/eastasianwidth.h new file mode 100644 index 0000000..586e7ac --- /dev/null +++ b/unicode/eastasianwidth.h @@ -0,0 +1,42 @@ +static const unicode_char unicode_wcwidth_tab[][2]={ +{0x1100, 0x115f}, +{0x11a3, 0x11a7}, +{0x11fa, 0x11ff}, +{0x2329, 0x232a}, +{0x2e80, 0x2e99}, +{0x2e9b, 0x2ef3}, +{0x2f00, 0x2fd5}, +{0x2ff0, 0x2ffb}, +{0x3000, 0x303e}, +{0x3041, 0x3096}, +{0x3099, 0x30ff}, +{0x3105, 0x312d}, +{0x3131, 0x318e}, +{0x3190, 0x31ba}, +{0x31c0, 0x31e3}, +{0x31f0, 0x321e}, +{0x3220, 0x3247}, +{0x3250, 0x32fe}, +{0x3300, 0x4dbf}, +{0x4e00, 0xa48c}, +{0xa490, 0xa4c6}, +{0xa960, 0xa97c}, +{0xac00, 0xd7a3}, +{0xd7b0, 0xd7c6}, +{0xd7cb, 0xd7fb}, +{0xf900, 0xfaff}, +{0xfe10, 0xfe19}, +{0xfe30, 0xfe52}, +{0xfe54, 0xfe66}, +{0xfe68, 0xfe6b}, +{0xff01, 0xff60}, +{0xffe0, 0xffe6}, +{0x1b000, 0x1b001}, +{0x1f200, 0x1f202}, +{0x1f210, 0x1f23a}, +{0x1f240, 0x1f248}, +{0x1f250, 0x1f251}, +{0x20000, 0x2f73f}, +{0x2b740, 0x2fffd}, +{0x30000, 0x3fffd} +}; diff --git a/unicode/enttest.c b/unicode/enttest.c new file mode 100644 index 0000000..cf64390 --- /dev/null +++ b/unicode/enttest.c @@ -0,0 +1,55 @@ +#include "unicode_config.h" +#include "unicode.h" + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +struct i { + size_t n_start; + size_t n_size; + unicode_char v; +}; + +#include "unicode_htmlent.h" + +static void testsuite() +{ + size_t j; + + for (j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) + { + char buf[60]; + + memcpy(buf, n + ii[j].n_start, ii[j].n_size); + buf[ii[j].n_size]=0; + + if (unicode_html40ent_lookup(buf) != ii[j].v) + { + fprintf(stderr, "Did not find %s\n", buf); + exit(1); + } + + strcat(buf, "X"); + + if (unicode_html40ent_lookup(buf) == ii[j].v) + { + fprintf(stderr, "Found %s?\n", buf); + exit(1); + } + + buf[strlen(buf)-2]=0; + + if (unicode_html40ent_lookup(buf) == ii[j].v) + { + fprintf(stderr, "Found %s?\n", buf); + exit(1); + } + } +} + +int main(int argc, char **argv) +{ + testsuite(); + return 0; +} diff --git a/unicode/graphemebreaktab.h b/unicode/graphemebreaktab.h new file mode 100644 index 0000000..767c8f7 --- /dev/null +++ b/unicode/graphemebreaktab.h @@ -0,0 +1,5985 @@ +static const uint8_t unicode_rangetab[][2]={ + {0x0000 & 0xFF, 0x0009 & 0xFF}, + {0x000a & 0xFF, 0x000a & 0xFF}, + {0x000b & 0xFF, 0x000c & 0xFF}, + {0x000d & 0xFF, 0x000d & 0xFF}, + {0x000e & 0xFF, 0x001f & 0xFF}, + {0x007f & 0xFF, 0x009f & 0xFF}, + {0x00ad & 0xFF, 0x00ad & 0xFF}, + {0x0300 & 0xFF, 0x036f & 0xFF}, + {0x0483 & 0xFF, 0x0489 & 0xFF}, + {0x0591 & 0xFF, 0x05bd & 0xFF}, + {0x05bf & 0xFF, 0x05bf & 0xFF}, + {0x05c1 & 0xFF, 0x05c2 & 0xFF}, + {0x05c4 & 0xFF, 0x05c5 & 0xFF}, + {0x05c7 & 0xFF, 0x05c7 & 0xFF}, + {0x0600 & 0xFF, 0x0603 & 0xFF}, + {0x0610 & 0xFF, 0x061a & 0xFF}, + {0x064b & 0xFF, 0x065f & 0xFF}, + {0x0670 & 0xFF, 0x0670 & 0xFF}, + {0x06d6 & 0xFF, 0x06dc & 0xFF}, + {0x06dd & 0xFF, 0x06dd & 0xFF}, + {0x06df & 0xFF, 0x06e4 & 0xFF}, + {0x06e7 & 0xFF, 0x06e8 & 0xFF}, + {0x06ea & 0xFF, 0x06ed & 0xFF}, + {0x070f & 0xFF, 0x070f & 0xFF}, + {0x0711 & 0xFF, 0x0711 & 0xFF}, + {0x0730 & 0xFF, 0x074a & 0xFF}, + {0x07a6 & 0xFF, 0x07b0 & 0xFF}, + {0x07eb & 0xFF, 0x07f3 & 0xFF}, + {0x0816 & 0xFF, 0x0819 & 0xFF}, + {0x081b & 0xFF, 0x0823 & 0xFF}, + {0x0825 & 0xFF, 0x0827 & 0xFF}, + {0x0829 & 0xFF, 0x082d & 0xFF}, + {0x0859 & 0xFF, 0x085b & 0xFF}, + {0x0900 & 0xFF, 0x0902 & 0xFF}, + {0x0903 & 0xFF, 0x0903 & 0xFF}, + {0x093a & 0xFF, 0x093a & 0xFF}, + {0x093b & 0xFF, 0x093b & 0xFF}, + {0x093c & 0xFF, 0x093c & 0xFF}, + {0x093e & 0xFF, 0x0940 & 0xFF}, + {0x0941 & 0xFF, 0x0948 & 0xFF}, + {0x0949 & 0xFF, 0x094c & 0xFF}, + {0x094d & 0xFF, 0x094d & 0xFF}, + {0x094e & 0xFF, 0x094f & 0xFF}, + {0x0951 & 0xFF, 0x0957 & 0xFF}, + {0x0962 & 0xFF, 0x0963 & 0xFF}, + {0x0981 & 0xFF, 0x0981 & 0xFF}, + {0x0982 & 0xFF, 0x0983 & 0xFF}, + {0x09bc & 0xFF, 0x09bc & 0xFF}, + {0x09be & 0xFF, 0x09be & 0xFF}, + {0x09bf & 0xFF, 0x09c0 & 0xFF}, + {0x09c1 & 0xFF, 0x09c4 & 0xFF}, + {0x09c7 & 0xFF, 0x09c8 & 0xFF}, + {0x09cb & 0xFF, 0x09cc & 0xFF}, + {0x09cd & 0xFF, 0x09cd & 0xFF}, + {0x09d7 & 0xFF, 0x09d7 & 0xFF}, + {0x09e2 & 0xFF, 0x09e3 & 0xFF}, + {0x0a01 & 0xFF, 0x0a02 & 0xFF}, + {0x0a03 & 0xFF, 0x0a03 & 0xFF}, + {0x0a3c & 0xFF, 0x0a3c & 0xFF}, + {0x0a3e & 0xFF, 0x0a40 & 0xFF}, + {0x0a41 & 0xFF, 0x0a42 & 0xFF}, + {0x0a47 & 0xFF, 0x0a48 & 0xFF}, + {0x0a4b & 0xFF, 0x0a4d & 0xFF}, + {0x0a51 & 0xFF, 0x0a51 & 0xFF}, + {0x0a70 & 0xFF, 0x0a71 & 0xFF}, + {0x0a75 & 0xFF, 0x0a75 & 0xFF}, + {0x0a81 & 0xFF, 0x0a82 & 0xFF}, + {0x0a83 & 0xFF, 0x0a83 & 0xFF}, + {0x0abc & 0xFF, 0x0abc & 0xFF}, + {0x0abe & 0xFF, 0x0ac0 & 0xFF}, + {0x0ac1 & 0xFF, 0x0ac5 & 0xFF}, + {0x0ac7 & 0xFF, 0x0ac8 & 0xFF}, + {0x0ac9 & 0xFF, 0x0ac9 & 0xFF}, + {0x0acb & 0xFF, 0x0acc & 0xFF}, + {0x0acd & 0xFF, 0x0acd & 0xFF}, + {0x0ae2 & 0xFF, 0x0ae3 & 0xFF}, + {0x0b01 & 0xFF, 0x0b01 & 0xFF}, + {0x0b02 & 0xFF, 0x0b03 & 0xFF}, + {0x0b3c & 0xFF, 0x0b3c & 0xFF}, + {0x0b3e & 0xFF, 0x0b3f & 0xFF}, + {0x0b40 & 0xFF, 0x0b40 & 0xFF}, + {0x0b41 & 0xFF, 0x0b44 & 0xFF}, + {0x0b47 & 0xFF, 0x0b48 & 0xFF}, + {0x0b4b & 0xFF, 0x0b4c & 0xFF}, + {0x0b4d & 0xFF, 0x0b4d & 0xFF}, + {0x0b56 & 0xFF, 0x0b57 & 0xFF}, + {0x0b62 & 0xFF, 0x0b63 & 0xFF}, + {0x0b82 & 0xFF, 0x0b82 & 0xFF}, + {0x0bbe & 0xFF, 0x0bbe & 0xFF}, + {0x0bbf & 0xFF, 0x0bbf & 0xFF}, + {0x0bc0 & 0xFF, 0x0bc0 & 0xFF}, + {0x0bc1 & 0xFF, 0x0bc2 & 0xFF}, + {0x0bc6 & 0xFF, 0x0bc8 & 0xFF}, + {0x0bca & 0xFF, 0x0bcc & 0xFF}, + {0x0bcd & 0xFF, 0x0bcd & 0xFF}, + {0x0bd7 & 0xFF, 0x0bd7 & 0xFF}, + {0x0c01 & 0xFF, 0x0c03 & 0xFF}, + {0x0c3e & 0xFF, 0x0c40 & 0xFF}, + {0x0c41 & 0xFF, 0x0c44 & 0xFF}, + {0x0c46 & 0xFF, 0x0c48 & 0xFF}, + {0x0c4a & 0xFF, 0x0c4d & 0xFF}, + {0x0c55 & 0xFF, 0x0c56 & 0xFF}, + {0x0c62 & 0xFF, 0x0c63 & 0xFF}, + {0x0c82 & 0xFF, 0x0c83 & 0xFF}, + {0x0cbc & 0xFF, 0x0cbc & 0xFF}, + {0x0cbe & 0xFF, 0x0cbe & 0xFF}, + {0x0cbf & 0xFF, 0x0cbf & 0xFF}, + {0x0cc0 & 0xFF, 0x0cc1 & 0xFF}, + {0x0cc2 & 0xFF, 0x0cc2 & 0xFF}, + {0x0cc3 & 0xFF, 0x0cc4 & 0xFF}, + {0x0cc6 & 0xFF, 0x0cc6 & 0xFF}, + {0x0cc7 & 0xFF, 0x0cc8 & 0xFF}, + {0x0cca & 0xFF, 0x0ccb & 0xFF}, + {0x0ccc & 0xFF, 0x0ccd & 0xFF}, + {0x0cd5 & 0xFF, 0x0cd6 & 0xFF}, + {0x0ce2 & 0xFF, 0x0ce3 & 0xFF}, + {0x0d02 & 0xFF, 0x0d03 & 0xFF}, + {0x0d3e & 0xFF, 0x0d3e & 0xFF}, + {0x0d3f & 0xFF, 0x0d40 & 0xFF}, + {0x0d41 & 0xFF, 0x0d44 & 0xFF}, + {0x0d46 & 0xFF, 0x0d48 & 0xFF}, + {0x0d4a & 0xFF, 0x0d4c & 0xFF}, + {0x0d4d & 0xFF, 0x0d4d & 0xFF}, + {0x0d57 & 0xFF, 0x0d57 & 0xFF}, + {0x0d62 & 0xFF, 0x0d63 & 0xFF}, + {0x0d82 & 0xFF, 0x0d83 & 0xFF}, + {0x0dca & 0xFF, 0x0dca & 0xFF}, + {0x0dcf & 0xFF, 0x0dcf & 0xFF}, + {0x0dd0 & 0xFF, 0x0dd1 & 0xFF}, + {0x0dd2 & 0xFF, 0x0dd4 & 0xFF}, + {0x0dd6 & 0xFF, 0x0dd6 & 0xFF}, + {0x0dd8 & 0xFF, 0x0dde & 0xFF}, + {0x0ddf & 0xFF, 0x0ddf & 0xFF}, + {0x0df2 & 0xFF, 0x0df3 & 0xFF}, + {0x0e30 & 0xFF, 0x0e30 & 0xFF}, + {0x0e31 & 0xFF, 0x0e31 & 0xFF}, + {0x0e32 & 0xFF, 0x0e33 & 0xFF}, + {0x0e34 & 0xFF, 0x0e3a & 0xFF}, + {0x0e40 & 0xFF, 0x0e44 & 0xFF}, + {0x0e45 & 0xFF, 0x0e45 & 0xFF}, + {0x0e47 & 0xFF, 0x0e4e & 0xFF}, + {0x0eb0 & 0xFF, 0x0eb0 & 0xFF}, + {0x0eb1 & 0xFF, 0x0eb1 & 0xFF}, + {0x0eb2 & 0xFF, 0x0eb3 & 0xFF}, + {0x0eb4 & 0xFF, 0x0eb9 & 0xFF}, + {0x0ebb & 0xFF, 0x0ebc & 0xFF}, + {0x0ec0 & 0xFF, 0x0ec4 & 0xFF}, + {0x0ec8 & 0xFF, 0x0ecd & 0xFF}, + {0x0f18 & 0xFF, 0x0f19 & 0xFF}, + {0x0f35 & 0xFF, 0x0f35 & 0xFF}, + {0x0f37 & 0xFF, 0x0f37 & 0xFF}, + {0x0f39 & 0xFF, 0x0f39 & 0xFF}, + {0x0f3e & 0xFF, 0x0f3f & 0xFF}, + {0x0f71 & 0xFF, 0x0f7e & 0xFF}, + {0x0f7f & 0xFF, 0x0f7f & 0xFF}, + {0x0f80 & 0xFF, 0x0f84 & 0xFF}, + {0x0f86 & 0xFF, 0x0f87 & 0xFF}, + {0x0f8d & 0xFF, 0x0f97 & 0xFF}, + {0x0f99 & 0xFF, 0x0fbc & 0xFF}, + {0x0fc6 & 0xFF, 0x0fc6 & 0xFF}, + {0x102b & 0xFF, 0x102c & 0xFF}, + {0x102d & 0xFF, 0x1030 & 0xFF}, + {0x1031 & 0xFF, 0x1031 & 0xFF}, + {0x1032 & 0xFF, 0x1037 & 0xFF}, + {0x1038 & 0xFF, 0x1038 & 0xFF}, + {0x1039 & 0xFF, 0x103a & 0xFF}, + {0x103b & 0xFF, 0x103c & 0xFF}, + {0x103d & 0xFF, 0x103e & 0xFF}, + {0x1056 & 0xFF, 0x1057 & 0xFF}, + {0x1058 & 0xFF, 0x1059 & 0xFF}, + {0x105e & 0xFF, 0x1060 & 0xFF}, + {0x1062 & 0xFF, 0x1064 & 0xFF}, + {0x1067 & 0xFF, 0x106d & 0xFF}, + {0x1071 & 0xFF, 0x1074 & 0xFF}, + {0x1082 & 0xFF, 0x1082 & 0xFF}, + {0x1083 & 0xFF, 0x1084 & 0xFF}, + {0x1085 & 0xFF, 0x1086 & 0xFF}, + {0x1087 & 0xFF, 0x108c & 0xFF}, + {0x108d & 0xFF, 0x108d & 0xFF}, + {0x108f & 0xFF, 0x108f & 0xFF}, + {0x109a & 0xFF, 0x109c & 0xFF}, + {0x109d & 0xFF, 0x109d & 0xFF}, + {0x1100 & 0xFF, 0x115f & 0xFF}, + {0x1160 & 0xFF, 0x11a7 & 0xFF}, + {0x11a8 & 0xFF, 0x11ff & 0xFF}, + {0x135d & 0xFF, 0x135f & 0xFF}, + {0x1712 & 0xFF, 0x1714 & 0xFF}, + {0x1732 & 0xFF, 0x1734 & 0xFF}, + {0x1752 & 0xFF, 0x1753 & 0xFF}, + {0x1772 & 0xFF, 0x1773 & 0xFF}, + {0x17b4 & 0xFF, 0x17b5 & 0xFF}, + {0x17b6 & 0xFF, 0x17b6 & 0xFF}, + {0x17b7 & 0xFF, 0x17bd & 0xFF}, + {0x17be & 0xFF, 0x17c5 & 0xFF}, + {0x17c6 & 0xFF, 0x17c6 & 0xFF}, + {0x17c7 & 0xFF, 0x17c8 & 0xFF}, + {0x17c9 & 0xFF, 0x17d3 & 0xFF}, + {0x17dd & 0xFF, 0x17dd & 0xFF}, + {0x180b & 0xFF, 0x180d & 0xFF}, + {0x18a9 & 0xFF, 0x18a9 & 0xFF}, + {0x1920 & 0xFF, 0x1922 & 0xFF}, + {0x1923 & 0xFF, 0x1926 & 0xFF}, + {0x1927 & 0xFF, 0x1928 & 0xFF}, + {0x1929 & 0xFF, 0x192b & 0xFF}, + {0x1930 & 0xFF, 0x1931 & 0xFF}, + {0x1932 & 0xFF, 0x1932 & 0xFF}, + {0x1933 & 0xFF, 0x1938 & 0xFF}, + {0x1939 & 0xFF, 0x193b & 0xFF}, + {0x19b0 & 0xFF, 0x19c0 & 0xFF}, + {0x19c8 & 0xFF, 0x19c9 & 0xFF}, + {0x1a17 & 0xFF, 0x1a18 & 0xFF}, + {0x1a19 & 0xFF, 0x1a1b & 0xFF}, + {0x1a55 & 0xFF, 0x1a55 & 0xFF}, + {0x1a56 & 0xFF, 0x1a56 & 0xFF}, + {0x1a57 & 0xFF, 0x1a57 & 0xFF}, + {0x1a58 & 0xFF, 0x1a5e & 0xFF}, + {0x1a60 & 0xFF, 0x1a60 & 0xFF}, + {0x1a61 & 0xFF, 0x1a61 & 0xFF}, + {0x1a62 & 0xFF, 0x1a62 & 0xFF}, + {0x1a63 & 0xFF, 0x1a64 & 0xFF}, + {0x1a65 & 0xFF, 0x1a6c & 0xFF}, + {0x1a6d & 0xFF, 0x1a72 & 0xFF}, + {0x1a73 & 0xFF, 0x1a7c & 0xFF}, + {0x1a7f & 0xFF, 0x1a7f & 0xFF}, + {0x1b00 & 0xFF, 0x1b03 & 0xFF}, + {0x1b04 & 0xFF, 0x1b04 & 0xFF}, + {0x1b34 & 0xFF, 0x1b34 & 0xFF}, + {0x1b35 & 0xFF, 0x1b35 & 0xFF}, + {0x1b36 & 0xFF, 0x1b3a & 0xFF}, + {0x1b3b & 0xFF, 0x1b3b & 0xFF}, + {0x1b3c & 0xFF, 0x1b3c & 0xFF}, + {0x1b3d & 0xFF, 0x1b41 & 0xFF}, + {0x1b42 & 0xFF, 0x1b42 & 0xFF}, + {0x1b43 & 0xFF, 0x1b44 & 0xFF}, + {0x1b6b & 0xFF, 0x1b73 & 0xFF}, + {0x1b80 & 0xFF, 0x1b81 & 0xFF}, + {0x1b82 & 0xFF, 0x1b82 & 0xFF}, + {0x1ba1 & 0xFF, 0x1ba1 & 0xFF}, + {0x1ba2 & 0xFF, 0x1ba5 & 0xFF}, + {0x1ba6 & 0xFF, 0x1ba7 & 0xFF}, + {0x1ba8 & 0xFF, 0x1ba9 & 0xFF}, + {0x1baa & 0xFF, 0x1baa & 0xFF}, + {0x1be6 & 0xFF, 0x1be6 & 0xFF}, + {0x1be7 & 0xFF, 0x1be7 & 0xFF}, + {0x1be8 & 0xFF, 0x1be9 & 0xFF}, + {0x1bea & 0xFF, 0x1bec & 0xFF}, + {0x1bed & 0xFF, 0x1bed & 0xFF}, + {0x1bee & 0xFF, 0x1bee & 0xFF}, + {0x1bef & 0xFF, 0x1bf1 & 0xFF}, + {0x1bf2 & 0xFF, 0x1bf3 & 0xFF}, + {0x1c24 & 0xFF, 0x1c2b & 0xFF}, + {0x1c2c & 0xFF, 0x1c33 & 0xFF}, + {0x1c34 & 0xFF, 0x1c35 & 0xFF}, + {0x1c36 & 0xFF, 0x1c37 & 0xFF}, + {0x1cd0 & 0xFF, 0x1cd2 & 0xFF}, + {0x1cd4 & 0xFF, 0x1ce0 & 0xFF}, + {0x1ce1 & 0xFF, 0x1ce1 & 0xFF}, + {0x1ce2 & 0xFF, 0x1ce8 & 0xFF}, + {0x1ced & 0xFF, 0x1ced & 0xFF}, + {0x1cf2 & 0xFF, 0x1cf2 & 0xFF}, + {0x1dc0 & 0xFF, 0x1de6 & 0xFF}, + {0x1dfc & 0xFF, 0x1dff & 0xFF}, + {0x200b & 0xFF, 0x200b & 0xFF}, + {0x200c & 0xFF, 0x200d & 0xFF}, + {0x200e & 0xFF, 0x200f & 0xFF}, + {0x2028 & 0xFF, 0x202e & 0xFF}, + {0x2060 & 0xFF, 0x2064 & 0xFF}, + {0x206a & 0xFF, 0x206f & 0xFF}, + {0x20d0 & 0xFF, 0x20f0 & 0xFF}, + {0x2cef & 0xFF, 0x2cf1 & 0xFF}, + {0x2d7f & 0xFF, 0x2d7f & 0xFF}, + {0x2de0 & 0xFF, 0x2dff & 0xFF}, + {0x302a & 0xFF, 0x302f & 0xFF}, + {0x3099 & 0xFF, 0x309a & 0xFF}, + {0xa66f & 0xFF, 0xa672 & 0xFF}, + {0xa67c & 0xFF, 0xa67d & 0xFF}, + {0xa6f0 & 0xFF, 0xa6f1 & 0xFF}, + {0xa802 & 0xFF, 0xa802 & 0xFF}, + {0xa806 & 0xFF, 0xa806 & 0xFF}, + {0xa80b & 0xFF, 0xa80b & 0xFF}, + {0xa823 & 0xFF, 0xa824 & 0xFF}, + {0xa825 & 0xFF, 0xa826 & 0xFF}, + {0xa827 & 0xFF, 0xa827 & 0xFF}, + {0xa880 & 0xFF, 0xa881 & 0xFF}, + {0xa8b4 & 0xFF, 0xa8c3 & 0xFF}, + {0xa8c4 & 0xFF, 0xa8c4 & 0xFF}, + {0xa8e0 & 0xFF, 0xa8f1 & 0xFF}, + {0xa926 & 0xFF, 0xa92d & 0xFF}, + {0xa947 & 0xFF, 0xa951 & 0xFF}, + {0xa952 & 0xFF, 0xa953 & 0xFF}, + {0xa960 & 0xFF, 0xa97c & 0xFF}, + {0xa980 & 0xFF, 0xa982 & 0xFF}, + {0xa983 & 0xFF, 0xa983 & 0xFF}, + {0xa9b3 & 0xFF, 0xa9b3 & 0xFF}, + {0xa9b4 & 0xFF, 0xa9b5 & 0xFF}, + {0xa9b6 & 0xFF, 0xa9b9 & 0xFF}, + {0xa9ba & 0xFF, 0xa9bb & 0xFF}, + {0xa9bc & 0xFF, 0xa9bc & 0xFF}, + {0xa9bd & 0xFF, 0xa9c0 & 0xFF}, + {0xaa29 & 0xFF, 0xaa2e & 0xFF}, + {0xaa2f & 0xFF, 0xaa30 & 0xFF}, + {0xaa31 & 0xFF, 0xaa32 & 0xFF}, + {0xaa33 & 0xFF, 0xaa34 & 0xFF}, + {0xaa35 & 0xFF, 0xaa36 & 0xFF}, + {0xaa43 & 0xFF, 0xaa43 & 0xFF}, + {0xaa4c & 0xFF, 0xaa4c & 0xFF}, + {0xaa4d & 0xFF, 0xaa4d & 0xFF}, + {0xaa7b & 0xFF, 0xaa7b & 0xFF}, + {0xaab0 & 0xFF, 0xaab0 & 0xFF}, + {0xaab2 & 0xFF, 0xaab4 & 0xFF}, + {0xaab5 & 0xFF, 0xaab6 & 0xFF}, + {0xaab7 & 0xFF, 0xaab8 & 0xFF}, + {0xaab9 & 0xFF, 0xaab9 & 0xFF}, + {0xaabb & 0xFF, 0xaabc & 0xFF}, + {0xaabe & 0xFF, 0xaabf & 0xFF}, + {0xaac1 & 0xFF, 0xaac1 & 0xFF}, + {0xabe3 & 0xFF, 0xabe4 & 0xFF}, + {0xabe5 & 0xFF, 0xabe5 & 0xFF}, + {0xabe6 & 0xFF, 0xabe7 & 0xFF}, + {0xabe8 & 0xFF, 0xabe8 & 0xFF}, + {0xabe9 & 0xFF, 0xabea & 0xFF}, + {0xabec & 0xFF, 0xabec & 0xFF}, + {0xabed & 0xFF, 0xabed & 0xFF}, + {0xac00 & 0xFF, 0xac00 & 0xFF}, + {0xac01 & 0xFF, 0xac1b & 0xFF}, + {0xac1c & 0xFF, 0xac1c & 0xFF}, + {0xac1d & 0xFF, 0xac37 & 0xFF}, + {0xac38 & 0xFF, 0xac38 & 0xFF}, + {0xac39 & 0xFF, 0xac53 & 0xFF}, + {0xac54 & 0xFF, 0xac54 & 0xFF}, + {0xac55 & 0xFF, 0xac6f & 0xFF}, + {0xac70 & 0xFF, 0xac70 & 0xFF}, + {0xac71 & 0xFF, 0xac8b & 0xFF}, + {0xac8c & 0xFF, 0xac8c & 0xFF}, + {0xac8d & 0xFF, 0xaca7 & 0xFF}, + {0xaca8 & 0xFF, 0xaca8 & 0xFF}, + {0xaca9 & 0xFF, 0xacc3 & 0xFF}, + {0xacc4 & 0xFF, 0xacc4 & 0xFF}, + {0xacc5 & 0xFF, 0xacdf & 0xFF}, + {0xace0 & 0xFF, 0xace0 & 0xFF}, + {0xace1 & 0xFF, 0xacfb & 0xFF}, + {0xacfc & 0xFF, 0xacfc & 0xFF}, + {0xacfd & 0xFF, 0xacff & 0xFF}, + {0xad00 & 0xFF, 0xad17 & 0xFF}, + {0xad18 & 0xFF, 0xad18 & 0xFF}, + {0xad19 & 0xFF, 0xad33 & 0xFF}, + {0xad34 & 0xFF, 0xad34 & 0xFF}, + {0xad35 & 0xFF, 0xad4f & 0xFF}, + {0xad50 & 0xFF, 0xad50 & 0xFF}, + {0xad51 & 0xFF, 0xad6b & 0xFF}, + {0xad6c & 0xFF, 0xad6c & 0xFF}, + {0xad6d & 0xFF, 0xad87 & 0xFF}, + {0xad88 & 0xFF, 0xad88 & 0xFF}, + {0xad89 & 0xFF, 0xada3 & 0xFF}, + {0xada4 & 0xFF, 0xada4 & 0xFF}, + {0xada5 & 0xFF, 0xadbf & 0xFF}, + {0xadc0 & 0xFF, 0xadc0 & 0xFF}, + {0xadc1 & 0xFF, 0xaddb & 0xFF}, + {0xaddc & 0xFF, 0xaddc & 0xFF}, + {0xaddd & 0xFF, 0xadf7 & 0xFF}, + {0xadf8 & 0xFF, 0xadf8 & 0xFF}, + {0xadf9 & 0xFF, 0xadff & 0xFF}, + {0xae00 & 0xFF, 0xae13 & 0xFF}, + {0xae14 & 0xFF, 0xae14 & 0xFF}, + {0xae15 & 0xFF, 0xae2f & 0xFF}, + {0xae30 & 0xFF, 0xae30 & 0xFF}, + {0xae31 & 0xFF, 0xae4b & 0xFF}, + {0xae4c & 0xFF, 0xae4c & 0xFF}, + {0xae4d & 0xFF, 0xae67 & 0xFF}, + {0xae68 & 0xFF, 0xae68 & 0xFF}, + {0xae69 & 0xFF, 0xae83 & 0xFF}, + {0xae84 & 0xFF, 0xae84 & 0xFF}, + {0xae85 & 0xFF, 0xae9f & 0xFF}, + {0xaea0 & 0xFF, 0xaea0 & 0xFF}, + {0xaea1 & 0xFF, 0xaebb & 0xFF}, + {0xaebc & 0xFF, 0xaebc & 0xFF}, + {0xaebd & 0xFF, 0xaed7 & 0xFF}, + {0xaed8 & 0xFF, 0xaed8 & 0xFF}, + {0xaed9 & 0xFF, 0xaef3 & 0xFF}, + {0xaef4 & 0xFF, 0xaef4 & 0xFF}, + {0xaef5 & 0xFF, 0xaeff & 0xFF}, + {0xaf00 & 0xFF, 0xaf0f & 0xFF}, + {0xaf10 & 0xFF, 0xaf10 & 0xFF}, + {0xaf11 & 0xFF, 0xaf2b & 0xFF}, + {0xaf2c & 0xFF, 0xaf2c & 0xFF}, + {0xaf2d & 0xFF, 0xaf47 & 0xFF}, + {0xaf48 & 0xFF, 0xaf48 & 0xFF}, + {0xaf49 & 0xFF, 0xaf63 & 0xFF}, + {0xaf64 & 0xFF, 0xaf64 & 0xFF}, + {0xaf65 & 0xFF, 0xaf7f & 0xFF}, + {0xaf80 & 0xFF, 0xaf80 & 0xFF}, + {0xaf81 & 0xFF, 0xaf9b & 0xFF}, + {0xaf9c & 0xFF, 0xaf9c & 0xFF}, + {0xaf9d & 0xFF, 0xafb7 & 0xFF}, + {0xafb8 & 0xFF, 0xafb8 & 0xFF}, + {0xafb9 & 0xFF, 0xafd3 & 0xFF}, + {0xafd4 & 0xFF, 0xafd4 & 0xFF}, + {0xafd5 & 0xFF, 0xafef & 0xFF}, + {0xaff0 & 0xFF, 0xaff0 & 0xFF}, + {0xaff1 & 0xFF, 0xafff & 0xFF}, + {0xb000 & 0xFF, 0xb00b & 0xFF}, + {0xb00c & 0xFF, 0xb00c & 0xFF}, + {0xb00d & 0xFF, 0xb027 & 0xFF}, + {0xb028 & 0xFF, 0xb028 & 0xFF}, + {0xb029 & 0xFF, 0xb043 & 0xFF}, + {0xb044 & 0xFF, 0xb044 & 0xFF}, + {0xb045 & 0xFF, 0xb05f & 0xFF}, + {0xb060 & 0xFF, 0xb060 & 0xFF}, + {0xb061 & 0xFF, 0xb07b & 0xFF}, + {0xb07c & 0xFF, 0xb07c & 0xFF}, + {0xb07d & 0xFF, 0xb097 & 0xFF}, + {0xb098 & 0xFF, 0xb098 & 0xFF}, + {0xb099 & 0xFF, 0xb0b3 & 0xFF}, + {0xb0b4 & 0xFF, 0xb0b4 & 0xFF}, + {0xb0b5 & 0xFF, 0xb0cf & 0xFF}, + {0xb0d0 & 0xFF, 0xb0d0 & 0xFF}, + {0xb0d1 & 0xFF, 0xb0eb & 0xFF}, + {0xb0ec & 0xFF, 0xb0ec & 0xFF}, + {0xb0ed & 0xFF, 0xb0ff & 0xFF}, + {0xb100 & 0xFF, 0xb107 & 0xFF}, + {0xb108 & 0xFF, 0xb108 & 0xFF}, + {0xb109 & 0xFF, 0xb123 & 0xFF}, + {0xb124 & 0xFF, 0xb124 & 0xFF}, + {0xb125 & 0xFF, 0xb13f & 0xFF}, + {0xb140 & 0xFF, 0xb140 & 0xFF}, + {0xb141 & 0xFF, 0xb15b & 0xFF}, + {0xb15c & 0xFF, 0xb15c & 0xFF}, + {0xb15d & 0xFF, 0xb177 & 0xFF}, + {0xb178 & 0xFF, 0xb178 & 0xFF}, + {0xb179 & 0xFF, 0xb193 & 0xFF}, + {0xb194 & 0xFF, 0xb194 & 0xFF}, + {0xb195 & 0xFF, 0xb1af & 0xFF}, + {0xb1b0 & 0xFF, 0xb1b0 & 0xFF}, + {0xb1b1 & 0xFF, 0xb1cb & 0xFF}, + {0xb1cc & 0xFF, 0xb1cc & 0xFF}, + {0xb1cd & 0xFF, 0xb1e7 & 0xFF}, + {0xb1e8 & 0xFF, 0xb1e8 & 0xFF}, + {0xb1e9 & 0xFF, 0xb1ff & 0xFF}, + {0xb200 & 0xFF, 0xb203 & 0xFF}, + {0xb204 & 0xFF, 0xb204 & 0xFF}, + {0xb205 & 0xFF, 0xb21f & 0xFF}, + {0xb220 & 0xFF, 0xb220 & 0xFF}, + {0xb221 & 0xFF, 0xb23b & 0xFF}, + {0xb23c & 0xFF, 0xb23c & 0xFF}, + {0xb23d & 0xFF, 0xb257 & 0xFF}, + {0xb258 & 0xFF, 0xb258 & 0xFF}, + {0xb259 & 0xFF, 0xb273 & 0xFF}, + {0xb274 & 0xFF, 0xb274 & 0xFF}, + {0xb275 & 0xFF, 0xb28f & 0xFF}, + {0xb290 & 0xFF, 0xb290 & 0xFF}, + {0xb291 & 0xFF, 0xb2ab & 0xFF}, + {0xb2ac & 0xFF, 0xb2ac & 0xFF}, + {0xb2ad & 0xFF, 0xb2c7 & 0xFF}, + {0xb2c8 & 0xFF, 0xb2c8 & 0xFF}, + {0xb2c9 & 0xFF, 0xb2e3 & 0xFF}, + {0xb2e4 & 0xFF, 0xb2e4 & 0xFF}, + {0xb2e5 & 0xFF, 0xb2ff & 0xFF}, + {0xb300 & 0xFF, 0xb300 & 0xFF}, + {0xb301 & 0xFF, 0xb31b & 0xFF}, + {0xb31c & 0xFF, 0xb31c & 0xFF}, + {0xb31d & 0xFF, 0xb337 & 0xFF}, + {0xb338 & 0xFF, 0xb338 & 0xFF}, + {0xb339 & 0xFF, 0xb353 & 0xFF}, + {0xb354 & 0xFF, 0xb354 & 0xFF}, + {0xb355 & 0xFF, 0xb36f & 0xFF}, + {0xb370 & 0xFF, 0xb370 & 0xFF}, + {0xb371 & 0xFF, 0xb38b & 0xFF}, + {0xb38c & 0xFF, 0xb38c & 0xFF}, + {0xb38d & 0xFF, 0xb3a7 & 0xFF}, + {0xb3a8 & 0xFF, 0xb3a8 & 0xFF}, + {0xb3a9 & 0xFF, 0xb3c3 & 0xFF}, + {0xb3c4 & 0xFF, 0xb3c4 & 0xFF}, + {0xb3c5 & 0xFF, 0xb3df & 0xFF}, + {0xb3e0 & 0xFF, 0xb3e0 & 0xFF}, + {0xb3e1 & 0xFF, 0xb3fb & 0xFF}, + {0xb3fc & 0xFF, 0xb3fc & 0xFF}, + {0xb3fd & 0xFF, 0xb3ff & 0xFF}, + {0xb400 & 0xFF, 0xb417 & 0xFF}, + {0xb418 & 0xFF, 0xb418 & 0xFF}, + {0xb419 & 0xFF, 0xb433 & 0xFF}, + {0xb434 & 0xFF, 0xb434 & 0xFF}, + {0xb435 & 0xFF, 0xb44f & 0xFF}, + {0xb450 & 0xFF, 0xb450 & 0xFF}, + {0xb451 & 0xFF, 0xb46b & 0xFF}, + {0xb46c & 0xFF, 0xb46c & 0xFF}, + {0xb46d & 0xFF, 0xb487 & 0xFF}, + {0xb488 & 0xFF, 0xb488 & 0xFF}, + {0xb489 & 0xFF, 0xb4a3 & 0xFF}, + {0xb4a4 & 0xFF, 0xb4a4 & 0xFF}, + {0xb4a5 & 0xFF, 0xb4bf & 0xFF}, + {0xb4c0 & 0xFF, 0xb4c0 & 0xFF}, + {0xb4c1 & 0xFF, 0xb4db & 0xFF}, + {0xb4dc & 0xFF, 0xb4dc & 0xFF}, + {0xb4dd & 0xFF, 0xb4f7 & 0xFF}, + {0xb4f8 & 0xFF, 0xb4f8 & 0xFF}, + {0xb4f9 & 0xFF, 0xb4ff & 0xFF}, + {0xb500 & 0xFF, 0xb513 & 0xFF}, + {0xb514 & 0xFF, 0xb514 & 0xFF}, + {0xb515 & 0xFF, 0xb52f & 0xFF}, + {0xb530 & 0xFF, 0xb530 & 0xFF}, + {0xb531 & 0xFF, 0xb54b & 0xFF}, + {0xb54c & 0xFF, 0xb54c & 0xFF}, + {0xb54d & 0xFF, 0xb567 & 0xFF}, + {0xb568 & 0xFF, 0xb568 & 0xFF}, + {0xb569 & 0xFF, 0xb583 & 0xFF}, + {0xb584 & 0xFF, 0xb584 & 0xFF}, + {0xb585 & 0xFF, 0xb59f & 0xFF}, + {0xb5a0 & 0xFF, 0xb5a0 & 0xFF}, + {0xb5a1 & 0xFF, 0xb5bb & 0xFF}, + {0xb5bc & 0xFF, 0xb5bc & 0xFF}, + {0xb5bd & 0xFF, 0xb5d7 & 0xFF}, + {0xb5d8 & 0xFF, 0xb5d8 & 0xFF}, + {0xb5d9 & 0xFF, 0xb5f3 & 0xFF}, + {0xb5f4 & 0xFF, 0xb5f4 & 0xFF}, + {0xb5f5 & 0xFF, 0xb5ff & 0xFF}, + {0xb600 & 0xFF, 0xb60f & 0xFF}, + {0xb610 & 0xFF, 0xb610 & 0xFF}, + {0xb611 & 0xFF, 0xb62b & 0xFF}, + {0xb62c & 0xFF, 0xb62c & 0xFF}, + {0xb62d & 0xFF, 0xb647 & 0xFF}, + {0xb648 & 0xFF, 0xb648 & 0xFF}, + {0xb649 & 0xFF, 0xb663 & 0xFF}, + {0xb664 & 0xFF, 0xb664 & 0xFF}, + {0xb665 & 0xFF, 0xb67f & 0xFF}, + {0xb680 & 0xFF, 0xb680 & 0xFF}, + {0xb681 & 0xFF, 0xb69b & 0xFF}, + {0xb69c & 0xFF, 0xb69c & 0xFF}, + {0xb69d & 0xFF, 0xb6b7 & 0xFF}, + {0xb6b8 & 0xFF, 0xb6b8 & 0xFF}, + {0xb6b9 & 0xFF, 0xb6d3 & 0xFF}, + {0xb6d4 & 0xFF, 0xb6d4 & 0xFF}, + {0xb6d5 & 0xFF, 0xb6ef & 0xFF}, + {0xb6f0 & 0xFF, 0xb6f0 & 0xFF}, + {0xb6f1 & 0xFF, 0xb6ff & 0xFF}, + {0xb700 & 0xFF, 0xb70b & 0xFF}, + {0xb70c & 0xFF, 0xb70c & 0xFF}, + {0xb70d & 0xFF, 0xb727 & 0xFF}, + {0xb728 & 0xFF, 0xb728 & 0xFF}, + {0xb729 & 0xFF, 0xb743 & 0xFF}, + {0xb744 & 0xFF, 0xb744 & 0xFF}, + {0xb745 & 0xFF, 0xb75f & 0xFF}, + {0xb760 & 0xFF, 0xb760 & 0xFF}, + {0xb761 & 0xFF, 0xb77b & 0xFF}, + {0xb77c & 0xFF, 0xb77c & 0xFF}, + {0xb77d & 0xFF, 0xb797 & 0xFF}, + {0xb798 & 0xFF, 0xb798 & 0xFF}, + {0xb799 & 0xFF, 0xb7b3 & 0xFF}, + {0xb7b4 & 0xFF, 0xb7b4 & 0xFF}, + {0xb7b5 & 0xFF, 0xb7cf & 0xFF}, + {0xb7d0 & 0xFF, 0xb7d0 & 0xFF}, + {0xb7d1 & 0xFF, 0xb7eb & 0xFF}, + {0xb7ec & 0xFF, 0xb7ec & 0xFF}, + {0xb7ed & 0xFF, 0xb7ff & 0xFF}, + {0xb800 & 0xFF, 0xb807 & 0xFF}, + {0xb808 & 0xFF, 0xb808 & 0xFF}, + {0xb809 & 0xFF, 0xb823 & 0xFF}, + {0xb824 & 0xFF, 0xb824 & 0xFF}, + {0xb825 & 0xFF, 0xb83f & 0xFF}, + {0xb840 & 0xFF, 0xb840 & 0xFF}, + {0xb841 & 0xFF, 0xb85b & 0xFF}, + {0xb85c & 0xFF, 0xb85c & 0xFF}, + {0xb85d & 0xFF, 0xb877 & 0xFF}, + {0xb878 & 0xFF, 0xb878 & 0xFF}, + {0xb879 & 0xFF, 0xb893 & 0xFF}, + {0xb894 & 0xFF, 0xb894 & 0xFF}, + {0xb895 & 0xFF, 0xb8af & 0xFF}, + {0xb8b0 & 0xFF, 0xb8b0 & 0xFF}, + {0xb8b1 & 0xFF, 0xb8cb & 0xFF}, + {0xb8cc & 0xFF, 0xb8cc & 0xFF}, + {0xb8cd & 0xFF, 0xb8e7 & 0xFF}, + {0xb8e8 & 0xFF, 0xb8e8 & 0xFF}, + {0xb8e9 & 0xFF, 0xb8ff & 0xFF}, + {0xb900 & 0xFF, 0xb903 & 0xFF}, + {0xb904 & 0xFF, 0xb904 & 0xFF}, + {0xb905 & 0xFF, 0xb91f & 0xFF}, + {0xb920 & 0xFF, 0xb920 & 0xFF}, + {0xb921 & 0xFF, 0xb93b & 0xFF}, + {0xb93c & 0xFF, 0xb93c & 0xFF}, + {0xb93d & 0xFF, 0xb957 & 0xFF}, + {0xb958 & 0xFF, 0xb958 & 0xFF}, + {0xb959 & 0xFF, 0xb973 & 0xFF}, + {0xb974 & 0xFF, 0xb974 & 0xFF}, + {0xb975 & 0xFF, 0xb98f & 0xFF}, + {0xb990 & 0xFF, 0xb990 & 0xFF}, + {0xb991 & 0xFF, 0xb9ab & 0xFF}, + {0xb9ac & 0xFF, 0xb9ac & 0xFF}, + {0xb9ad & 0xFF, 0xb9c7 & 0xFF}, + {0xb9c8 & 0xFF, 0xb9c8 & 0xFF}, + {0xb9c9 & 0xFF, 0xb9e3 & 0xFF}, + {0xb9e4 & 0xFF, 0xb9e4 & 0xFF}, + {0xb9e5 & 0xFF, 0xb9ff & 0xFF}, + {0xba00 & 0xFF, 0xba00 & 0xFF}, + {0xba01 & 0xFF, 0xba1b & 0xFF}, + {0xba1c & 0xFF, 0xba1c & 0xFF}, + {0xba1d & 0xFF, 0xba37 & 0xFF}, + {0xba38 & 0xFF, 0xba38 & 0xFF}, + {0xba39 & 0xFF, 0xba53 & 0xFF}, + {0xba54 & 0xFF, 0xba54 & 0xFF}, + {0xba55 & 0xFF, 0xba6f & 0xFF}, + {0xba70 & 0xFF, 0xba70 & 0xFF}, + {0xba71 & 0xFF, 0xba8b & 0xFF}, + {0xba8c & 0xFF, 0xba8c & 0xFF}, + {0xba8d & 0xFF, 0xbaa7 & 0xFF}, + {0xbaa8 & 0xFF, 0xbaa8 & 0xFF}, + {0xbaa9 & 0xFF, 0xbac3 & 0xFF}, + {0xbac4 & 0xFF, 0xbac4 & 0xFF}, + {0xbac5 & 0xFF, 0xbadf & 0xFF}, + {0xbae0 & 0xFF, 0xbae0 & 0xFF}, + {0xbae1 & 0xFF, 0xbafb & 0xFF}, + {0xbafc & 0xFF, 0xbafc & 0xFF}, + {0xbafd & 0xFF, 0xbaff & 0xFF}, + {0xbb00 & 0xFF, 0xbb17 & 0xFF}, + {0xbb18 & 0xFF, 0xbb18 & 0xFF}, + {0xbb19 & 0xFF, 0xbb33 & 0xFF}, + {0xbb34 & 0xFF, 0xbb34 & 0xFF}, + {0xbb35 & 0xFF, 0xbb4f & 0xFF}, + {0xbb50 & 0xFF, 0xbb50 & 0xFF}, + {0xbb51 & 0xFF, 0xbb6b & 0xFF}, + {0xbb6c & 0xFF, 0xbb6c & 0xFF}, + {0xbb6d & 0xFF, 0xbb87 & 0xFF}, + {0xbb88 & 0xFF, 0xbb88 & 0xFF}, + {0xbb89 & 0xFF, 0xbba3 & 0xFF}, + {0xbba4 & 0xFF, 0xbba4 & 0xFF}, + {0xbba5 & 0xFF, 0xbbbf & 0xFF}, + {0xbbc0 & 0xFF, 0xbbc0 & 0xFF}, + {0xbbc1 & 0xFF, 0xbbdb & 0xFF}, + {0xbbdc & 0xFF, 0xbbdc & 0xFF}, + {0xbbdd & 0xFF, 0xbbf7 & 0xFF}, + {0xbbf8 & 0xFF, 0xbbf8 & 0xFF}, + {0xbbf9 & 0xFF, 0xbbff & 0xFF}, + {0xbc00 & 0xFF, 0xbc13 & 0xFF}, + {0xbc14 & 0xFF, 0xbc14 & 0xFF}, + {0xbc15 & 0xFF, 0xbc2f & 0xFF}, + {0xbc30 & 0xFF, 0xbc30 & 0xFF}, + {0xbc31 & 0xFF, 0xbc4b & 0xFF}, + {0xbc4c & 0xFF, 0xbc4c & 0xFF}, + {0xbc4d & 0xFF, 0xbc67 & 0xFF}, + {0xbc68 & 0xFF, 0xbc68 & 0xFF}, + {0xbc69 & 0xFF, 0xbc83 & 0xFF}, + {0xbc84 & 0xFF, 0xbc84 & 0xFF}, + {0xbc85 & 0xFF, 0xbc9f & 0xFF}, + {0xbca0 & 0xFF, 0xbca0 & 0xFF}, + {0xbca1 & 0xFF, 0xbcbb & 0xFF}, + {0xbcbc & 0xFF, 0xbcbc & 0xFF}, + {0xbcbd & 0xFF, 0xbcd7 & 0xFF}, + {0xbcd8 & 0xFF, 0xbcd8 & 0xFF}, + {0xbcd9 & 0xFF, 0xbcf3 & 0xFF}, + {0xbcf4 & 0xFF, 0xbcf4 & 0xFF}, + {0xbcf5 & 0xFF, 0xbcff & 0xFF}, + {0xbd00 & 0xFF, 0xbd0f & 0xFF}, + {0xbd10 & 0xFF, 0xbd10 & 0xFF}, + {0xbd11 & 0xFF, 0xbd2b & 0xFF}, + {0xbd2c & 0xFF, 0xbd2c & 0xFF}, + {0xbd2d & 0xFF, 0xbd47 & 0xFF}, + {0xbd48 & 0xFF, 0xbd48 & 0xFF}, + {0xbd49 & 0xFF, 0xbd63 & 0xFF}, + {0xbd64 & 0xFF, 0xbd64 & 0xFF}, + {0xbd65 & 0xFF, 0xbd7f & 0xFF}, + {0xbd80 & 0xFF, 0xbd80 & 0xFF}, + {0xbd81 & 0xFF, 0xbd9b & 0xFF}, + {0xbd9c & 0xFF, 0xbd9c & 0xFF}, + {0xbd9d & 0xFF, 0xbdb7 & 0xFF}, + {0xbdb8 & 0xFF, 0xbdb8 & 0xFF}, + {0xbdb9 & 0xFF, 0xbdd3 & 0xFF}, + {0xbdd4 & 0xFF, 0xbdd4 & 0xFF}, + {0xbdd5 & 0xFF, 0xbdef & 0xFF}, + {0xbdf0 & 0xFF, 0xbdf0 & 0xFF}, + {0xbdf1 & 0xFF, 0xbdff & 0xFF}, + {0xbe00 & 0xFF, 0xbe0b & 0xFF}, + {0xbe0c & 0xFF, 0xbe0c & 0xFF}, + {0xbe0d & 0xFF, 0xbe27 & 0xFF}, + {0xbe28 & 0xFF, 0xbe28 & 0xFF}, + {0xbe29 & 0xFF, 0xbe43 & 0xFF}, + {0xbe44 & 0xFF, 0xbe44 & 0xFF}, + {0xbe45 & 0xFF, 0xbe5f & 0xFF}, + {0xbe60 & 0xFF, 0xbe60 & 0xFF}, + {0xbe61 & 0xFF, 0xbe7b & 0xFF}, + {0xbe7c & 0xFF, 0xbe7c & 0xFF}, + {0xbe7d & 0xFF, 0xbe97 & 0xFF}, + {0xbe98 & 0xFF, 0xbe98 & 0xFF}, + {0xbe99 & 0xFF, 0xbeb3 & 0xFF}, + {0xbeb4 & 0xFF, 0xbeb4 & 0xFF}, + {0xbeb5 & 0xFF, 0xbecf & 0xFF}, + {0xbed0 & 0xFF, 0xbed0 & 0xFF}, + {0xbed1 & 0xFF, 0xbeeb & 0xFF}, + {0xbeec & 0xFF, 0xbeec & 0xFF}, + {0xbeed & 0xFF, 0xbeff & 0xFF}, + {0xbf00 & 0xFF, 0xbf07 & 0xFF}, + {0xbf08 & 0xFF, 0xbf08 & 0xFF}, + {0xbf09 & 0xFF, 0xbf23 & 0xFF}, + {0xbf24 & 0xFF, 0xbf24 & 0xFF}, + {0xbf25 & 0xFF, 0xbf3f & 0xFF}, + {0xbf40 & 0xFF, 0xbf40 & 0xFF}, + {0xbf41 & 0xFF, 0xbf5b & 0xFF}, + {0xbf5c & 0xFF, 0xbf5c & 0xFF}, + {0xbf5d & 0xFF, 0xbf77 & 0xFF}, + {0xbf78 & 0xFF, 0xbf78 & 0xFF}, + {0xbf79 & 0xFF, 0xbf93 & 0xFF}, + {0xbf94 & 0xFF, 0xbf94 & 0xFF}, + {0xbf95 & 0xFF, 0xbfaf & 0xFF}, + {0xbfb0 & 0xFF, 0xbfb0 & 0xFF}, + {0xbfb1 & 0xFF, 0xbfcb & 0xFF}, + {0xbfcc & 0xFF, 0xbfcc & 0xFF}, + {0xbfcd & 0xFF, 0xbfe7 & 0xFF}, + {0xbfe8 & 0xFF, 0xbfe8 & 0xFF}, + {0xbfe9 & 0xFF, 0xbfff & 0xFF}, + {0xc000 & 0xFF, 0xc003 & 0xFF}, + {0xc004 & 0xFF, 0xc004 & 0xFF}, + {0xc005 & 0xFF, 0xc01f & 0xFF}, + {0xc020 & 0xFF, 0xc020 & 0xFF}, + {0xc021 & 0xFF, 0xc03b & 0xFF}, + {0xc03c & 0xFF, 0xc03c & 0xFF}, + {0xc03d & 0xFF, 0xc057 & 0xFF}, + {0xc058 & 0xFF, 0xc058 & 0xFF}, + {0xc059 & 0xFF, 0xc073 & 0xFF}, + {0xc074 & 0xFF, 0xc074 & 0xFF}, + {0xc075 & 0xFF, 0xc08f & 0xFF}, + {0xc090 & 0xFF, 0xc090 & 0xFF}, + {0xc091 & 0xFF, 0xc0ab & 0xFF}, + {0xc0ac & 0xFF, 0xc0ac & 0xFF}, + {0xc0ad & 0xFF, 0xc0c7 & 0xFF}, + {0xc0c8 & 0xFF, 0xc0c8 & 0xFF}, + {0xc0c9 & 0xFF, 0xc0e3 & 0xFF}, + {0xc0e4 & 0xFF, 0xc0e4 & 0xFF}, + {0xc0e5 & 0xFF, 0xc0ff & 0xFF}, + {0xc100 & 0xFF, 0xc100 & 0xFF}, + {0xc101 & 0xFF, 0xc11b & 0xFF}, + {0xc11c & 0xFF, 0xc11c & 0xFF}, + {0xc11d & 0xFF, 0xc137 & 0xFF}, + {0xc138 & 0xFF, 0xc138 & 0xFF}, + {0xc139 & 0xFF, 0xc153 & 0xFF}, + {0xc154 & 0xFF, 0xc154 & 0xFF}, + {0xc155 & 0xFF, 0xc16f & 0xFF}, + {0xc170 & 0xFF, 0xc170 & 0xFF}, + {0xc171 & 0xFF, 0xc18b & 0xFF}, + {0xc18c & 0xFF, 0xc18c & 0xFF}, + {0xc18d & 0xFF, 0xc1a7 & 0xFF}, + {0xc1a8 & 0xFF, 0xc1a8 & 0xFF}, + {0xc1a9 & 0xFF, 0xc1c3 & 0xFF}, + {0xc1c4 & 0xFF, 0xc1c4 & 0xFF}, + {0xc1c5 & 0xFF, 0xc1df & 0xFF}, + {0xc1e0 & 0xFF, 0xc1e0 & 0xFF}, + {0xc1e1 & 0xFF, 0xc1fb & 0xFF}, + {0xc1fc & 0xFF, 0xc1fc & 0xFF}, + {0xc1fd & 0xFF, 0xc1ff & 0xFF}, + {0xc200 & 0xFF, 0xc217 & 0xFF}, + {0xc218 & 0xFF, 0xc218 & 0xFF}, + {0xc219 & 0xFF, 0xc233 & 0xFF}, + {0xc234 & 0xFF, 0xc234 & 0xFF}, + {0xc235 & 0xFF, 0xc24f & 0xFF}, + {0xc250 & 0xFF, 0xc250 & 0xFF}, + {0xc251 & 0xFF, 0xc26b & 0xFF}, + {0xc26c & 0xFF, 0xc26c & 0xFF}, + {0xc26d & 0xFF, 0xc287 & 0xFF}, + {0xc288 & 0xFF, 0xc288 & 0xFF}, + {0xc289 & 0xFF, 0xc2a3 & 0xFF}, + {0xc2a4 & 0xFF, 0xc2a4 & 0xFF}, + {0xc2a5 & 0xFF, 0xc2bf & 0xFF}, + {0xc2c0 & 0xFF, 0xc2c0 & 0xFF}, + {0xc2c1 & 0xFF, 0xc2db & 0xFF}, + {0xc2dc & 0xFF, 0xc2dc & 0xFF}, + {0xc2dd & 0xFF, 0xc2f7 & 0xFF}, + {0xc2f8 & 0xFF, 0xc2f8 & 0xFF}, + {0xc2f9 & 0xFF, 0xc2ff & 0xFF}, + {0xc300 & 0xFF, 0xc313 & 0xFF}, + {0xc314 & 0xFF, 0xc314 & 0xFF}, + {0xc315 & 0xFF, 0xc32f & 0xFF}, + {0xc330 & 0xFF, 0xc330 & 0xFF}, + {0xc331 & 0xFF, 0xc34b & 0xFF}, + {0xc34c & 0xFF, 0xc34c & 0xFF}, + {0xc34d & 0xFF, 0xc367 & 0xFF}, + {0xc368 & 0xFF, 0xc368 & 0xFF}, + {0xc369 & 0xFF, 0xc383 & 0xFF}, + {0xc384 & 0xFF, 0xc384 & 0xFF}, + {0xc385 & 0xFF, 0xc39f & 0xFF}, + {0xc3a0 & 0xFF, 0xc3a0 & 0xFF}, + {0xc3a1 & 0xFF, 0xc3bb & 0xFF}, + {0xc3bc & 0xFF, 0xc3bc & 0xFF}, + {0xc3bd & 0xFF, 0xc3d7 & 0xFF}, + {0xc3d8 & 0xFF, 0xc3d8 & 0xFF}, + {0xc3d9 & 0xFF, 0xc3f3 & 0xFF}, + {0xc3f4 & 0xFF, 0xc3f4 & 0xFF}, + {0xc3f5 & 0xFF, 0xc3ff & 0xFF}, + {0xc400 & 0xFF, 0xc40f & 0xFF}, + {0xc410 & 0xFF, 0xc410 & 0xFF}, + {0xc411 & 0xFF, 0xc42b & 0xFF}, + {0xc42c & 0xFF, 0xc42c & 0xFF}, + {0xc42d & 0xFF, 0xc447 & 0xFF}, + {0xc448 & 0xFF, 0xc448 & 0xFF}, + {0xc449 & 0xFF, 0xc463 & 0xFF}, + {0xc464 & 0xFF, 0xc464 & 0xFF}, + {0xc465 & 0xFF, 0xc47f & 0xFF}, + {0xc480 & 0xFF, 0xc480 & 0xFF}, + {0xc481 & 0xFF, 0xc49b & 0xFF}, + {0xc49c & 0xFF, 0xc49c & 0xFF}, + {0xc49d & 0xFF, 0xc4b7 & 0xFF}, + {0xc4b8 & 0xFF, 0xc4b8 & 0xFF}, + {0xc4b9 & 0xFF, 0xc4d3 & 0xFF}, + {0xc4d4 & 0xFF, 0xc4d4 & 0xFF}, + {0xc4d5 & 0xFF, 0xc4ef & 0xFF}, + {0xc4f0 & 0xFF, 0xc4f0 & 0xFF}, + {0xc4f1 & 0xFF, 0xc4ff & 0xFF}, + {0xc500 & 0xFF, 0xc50b & 0xFF}, + {0xc50c & 0xFF, 0xc50c & 0xFF}, + {0xc50d & 0xFF, 0xc527 & 0xFF}, + {0xc528 & 0xFF, 0xc528 & 0xFF}, + {0xc529 & 0xFF, 0xc543 & 0xFF}, + {0xc544 & 0xFF, 0xc544 & 0xFF}, + {0xc545 & 0xFF, 0xc55f & 0xFF}, + {0xc560 & 0xFF, 0xc560 & 0xFF}, + {0xc561 & 0xFF, 0xc57b & 0xFF}, + {0xc57c & 0xFF, 0xc57c & 0xFF}, + {0xc57d & 0xFF, 0xc597 & 0xFF}, + {0xc598 & 0xFF, 0xc598 & 0xFF}, + {0xc599 & 0xFF, 0xc5b3 & 0xFF}, + {0xc5b4 & 0xFF, 0xc5b4 & 0xFF}, + {0xc5b5 & 0xFF, 0xc5cf & 0xFF}, + {0xc5d0 & 0xFF, 0xc5d0 & 0xFF}, + {0xc5d1 & 0xFF, 0xc5eb & 0xFF}, + {0xc5ec & 0xFF, 0xc5ec & 0xFF}, + {0xc5ed & 0xFF, 0xc5ff & 0xFF}, + {0xc600 & 0xFF, 0xc607 & 0xFF}, + {0xc608 & 0xFF, 0xc608 & 0xFF}, + {0xc609 & 0xFF, 0xc623 & 0xFF}, + {0xc624 & 0xFF, 0xc624 & 0xFF}, + {0xc625 & 0xFF, 0xc63f & 0xFF}, + {0xc640 & 0xFF, 0xc640 & 0xFF}, + {0xc641 & 0xFF, 0xc65b & 0xFF}, + {0xc65c & 0xFF, 0xc65c & 0xFF}, + {0xc65d & 0xFF, 0xc677 & 0xFF}, + {0xc678 & 0xFF, 0xc678 & 0xFF}, + {0xc679 & 0xFF, 0xc693 & 0xFF}, + {0xc694 & 0xFF, 0xc694 & 0xFF}, + {0xc695 & 0xFF, 0xc6af & 0xFF}, + {0xc6b0 & 0xFF, 0xc6b0 & 0xFF}, + {0xc6b1 & 0xFF, 0xc6cb & 0xFF}, + {0xc6cc & 0xFF, 0xc6cc & 0xFF}, + {0xc6cd & 0xFF, 0xc6e7 & 0xFF}, + {0xc6e8 & 0xFF, 0xc6e8 & 0xFF}, + {0xc6e9 & 0xFF, 0xc6ff & 0xFF}, + {0xc700 & 0xFF, 0xc703 & 0xFF}, + {0xc704 & 0xFF, 0xc704 & 0xFF}, + {0xc705 & 0xFF, 0xc71f & 0xFF}, + {0xc720 & 0xFF, 0xc720 & 0xFF}, + {0xc721 & 0xFF, 0xc73b & 0xFF}, + {0xc73c & 0xFF, 0xc73c & 0xFF}, + {0xc73d & 0xFF, 0xc757 & 0xFF}, + {0xc758 & 0xFF, 0xc758 & 0xFF}, + {0xc759 & 0xFF, 0xc773 & 0xFF}, + {0xc774 & 0xFF, 0xc774 & 0xFF}, + {0xc775 & 0xFF, 0xc78f & 0xFF}, + {0xc790 & 0xFF, 0xc790 & 0xFF}, + {0xc791 & 0xFF, 0xc7ab & 0xFF}, + {0xc7ac & 0xFF, 0xc7ac & 0xFF}, + {0xc7ad & 0xFF, 0xc7c7 & 0xFF}, + {0xc7c8 & 0xFF, 0xc7c8 & 0xFF}, + {0xc7c9 & 0xFF, 0xc7e3 & 0xFF}, + {0xc7e4 & 0xFF, 0xc7e4 & 0xFF}, + {0xc7e5 & 0xFF, 0xc7ff & 0xFF}, + {0xc800 & 0xFF, 0xc800 & 0xFF}, + {0xc801 & 0xFF, 0xc81b & 0xFF}, + {0xc81c & 0xFF, 0xc81c & 0xFF}, + {0xc81d & 0xFF, 0xc837 & 0xFF}, + {0xc838 & 0xFF, 0xc838 & 0xFF}, + {0xc839 & 0xFF, 0xc853 & 0xFF}, + {0xc854 & 0xFF, 0xc854 & 0xFF}, + {0xc855 & 0xFF, 0xc86f & 0xFF}, + {0xc870 & 0xFF, 0xc870 & 0xFF}, + {0xc871 & 0xFF, 0xc88b & 0xFF}, + {0xc88c & 0xFF, 0xc88c & 0xFF}, + {0xc88d & 0xFF, 0xc8a7 & 0xFF}, + {0xc8a8 & 0xFF, 0xc8a8 & 0xFF}, + {0xc8a9 & 0xFF, 0xc8c3 & 0xFF}, + {0xc8c4 & 0xFF, 0xc8c4 & 0xFF}, + {0xc8c5 & 0xFF, 0xc8df & 0xFF}, + {0xc8e0 & 0xFF, 0xc8e0 & 0xFF}, + {0xc8e1 & 0xFF, 0xc8fb & 0xFF}, + {0xc8fc & 0xFF, 0xc8fc & 0xFF}, + {0xc8fd & 0xFF, 0xc8ff & 0xFF}, + {0xc900 & 0xFF, 0xc917 & 0xFF}, + {0xc918 & 0xFF, 0xc918 & 0xFF}, + {0xc919 & 0xFF, 0xc933 & 0xFF}, + {0xc934 & 0xFF, 0xc934 & 0xFF}, + {0xc935 & 0xFF, 0xc94f & 0xFF}, + {0xc950 & 0xFF, 0xc950 & 0xFF}, + {0xc951 & 0xFF, 0xc96b & 0xFF}, + {0xc96c & 0xFF, 0xc96c & 0xFF}, + {0xc96d & 0xFF, 0xc987 & 0xFF}, + {0xc988 & 0xFF, 0xc988 & 0xFF}, + {0xc989 & 0xFF, 0xc9a3 & 0xFF}, + {0xc9a4 & 0xFF, 0xc9a4 & 0xFF}, + {0xc9a5 & 0xFF, 0xc9bf & 0xFF}, + {0xc9c0 & 0xFF, 0xc9c0 & 0xFF}, + {0xc9c1 & 0xFF, 0xc9db & 0xFF}, + {0xc9dc & 0xFF, 0xc9dc & 0xFF}, + {0xc9dd & 0xFF, 0xc9f7 & 0xFF}, + {0xc9f8 & 0xFF, 0xc9f8 & 0xFF}, + {0xc9f9 & 0xFF, 0xc9ff & 0xFF}, + {0xca00 & 0xFF, 0xca13 & 0xFF}, + {0xca14 & 0xFF, 0xca14 & 0xFF}, + {0xca15 & 0xFF, 0xca2f & 0xFF}, + {0xca30 & 0xFF, 0xca30 & 0xFF}, + {0xca31 & 0xFF, 0xca4b & 0xFF}, + {0xca4c & 0xFF, 0xca4c & 0xFF}, + {0xca4d & 0xFF, 0xca67 & 0xFF}, + {0xca68 & 0xFF, 0xca68 & 0xFF}, + {0xca69 & 0xFF, 0xca83 & 0xFF}, + {0xca84 & 0xFF, 0xca84 & 0xFF}, + {0xca85 & 0xFF, 0xca9f & 0xFF}, + {0xcaa0 & 0xFF, 0xcaa0 & 0xFF}, + {0xcaa1 & 0xFF, 0xcabb & 0xFF}, + {0xcabc & 0xFF, 0xcabc & 0xFF}, + {0xcabd & 0xFF, 0xcad7 & 0xFF}, + {0xcad8 & 0xFF, 0xcad8 & 0xFF}, + {0xcad9 & 0xFF, 0xcaf3 & 0xFF}, + {0xcaf4 & 0xFF, 0xcaf4 & 0xFF}, + {0xcaf5 & 0xFF, 0xcaff & 0xFF}, + {0xcb00 & 0xFF, 0xcb0f & 0xFF}, + {0xcb10 & 0xFF, 0xcb10 & 0xFF}, + {0xcb11 & 0xFF, 0xcb2b & 0xFF}, + {0xcb2c & 0xFF, 0xcb2c & 0xFF}, + {0xcb2d & 0xFF, 0xcb47 & 0xFF}, + {0xcb48 & 0xFF, 0xcb48 & 0xFF}, + {0xcb49 & 0xFF, 0xcb63 & 0xFF}, + {0xcb64 & 0xFF, 0xcb64 & 0xFF}, + {0xcb65 & 0xFF, 0xcb7f & 0xFF}, + {0xcb80 & 0xFF, 0xcb80 & 0xFF}, + {0xcb81 & 0xFF, 0xcb9b & 0xFF}, + {0xcb9c & 0xFF, 0xcb9c & 0xFF}, + {0xcb9d & 0xFF, 0xcbb7 & 0xFF}, + {0xcbb8 & 0xFF, 0xcbb8 & 0xFF}, + {0xcbb9 & 0xFF, 0xcbd3 & 0xFF}, + {0xcbd4 & 0xFF, 0xcbd4 & 0xFF}, + {0xcbd5 & 0xFF, 0xcbef & 0xFF}, + {0xcbf0 & 0xFF, 0xcbf0 & 0xFF}, + {0xcbf1 & 0xFF, 0xcbff & 0xFF}, + {0xcc00 & 0xFF, 0xcc0b & 0xFF}, + {0xcc0c & 0xFF, 0xcc0c & 0xFF}, + {0xcc0d & 0xFF, 0xcc27 & 0xFF}, + {0xcc28 & 0xFF, 0xcc28 & 0xFF}, + {0xcc29 & 0xFF, 0xcc43 & 0xFF}, + {0xcc44 & 0xFF, 0xcc44 & 0xFF}, + {0xcc45 & 0xFF, 0xcc5f & 0xFF}, + {0xcc60 & 0xFF, 0xcc60 & 0xFF}, + {0xcc61 & 0xFF, 0xcc7b & 0xFF}, + {0xcc7c & 0xFF, 0xcc7c & 0xFF}, + {0xcc7d & 0xFF, 0xcc97 & 0xFF}, + {0xcc98 & 0xFF, 0xcc98 & 0xFF}, + {0xcc99 & 0xFF, 0xccb3 & 0xFF}, + {0xccb4 & 0xFF, 0xccb4 & 0xFF}, + {0xccb5 & 0xFF, 0xcccf & 0xFF}, + {0xccd0 & 0xFF, 0xccd0 & 0xFF}, + {0xccd1 & 0xFF, 0xcceb & 0xFF}, + {0xccec & 0xFF, 0xccec & 0xFF}, + {0xcced & 0xFF, 0xccff & 0xFF}, + {0xcd00 & 0xFF, 0xcd07 & 0xFF}, + {0xcd08 & 0xFF, 0xcd08 & 0xFF}, + {0xcd09 & 0xFF, 0xcd23 & 0xFF}, + {0xcd24 & 0xFF, 0xcd24 & 0xFF}, + {0xcd25 & 0xFF, 0xcd3f & 0xFF}, + {0xcd40 & 0xFF, 0xcd40 & 0xFF}, + {0xcd41 & 0xFF, 0xcd5b & 0xFF}, + {0xcd5c & 0xFF, 0xcd5c & 0xFF}, + {0xcd5d & 0xFF, 0xcd77 & 0xFF}, + {0xcd78 & 0xFF, 0xcd78 & 0xFF}, + {0xcd79 & 0xFF, 0xcd93 & 0xFF}, + {0xcd94 & 0xFF, 0xcd94 & 0xFF}, + {0xcd95 & 0xFF, 0xcdaf & 0xFF}, + {0xcdb0 & 0xFF, 0xcdb0 & 0xFF}, + {0xcdb1 & 0xFF, 0xcdcb & 0xFF}, + {0xcdcc & 0xFF, 0xcdcc & 0xFF}, + {0xcdcd & 0xFF, 0xcde7 & 0xFF}, + {0xcde8 & 0xFF, 0xcde8 & 0xFF}, + {0xcde9 & 0xFF, 0xcdff & 0xFF}, + {0xce00 & 0xFF, 0xce03 & 0xFF}, + {0xce04 & 0xFF, 0xce04 & 0xFF}, + {0xce05 & 0xFF, 0xce1f & 0xFF}, + {0xce20 & 0xFF, 0xce20 & 0xFF}, + {0xce21 & 0xFF, 0xce3b & 0xFF}, + {0xce3c & 0xFF, 0xce3c & 0xFF}, + {0xce3d & 0xFF, 0xce57 & 0xFF}, + {0xce58 & 0xFF, 0xce58 & 0xFF}, + {0xce59 & 0xFF, 0xce73 & 0xFF}, + {0xce74 & 0xFF, 0xce74 & 0xFF}, + {0xce75 & 0xFF, 0xce8f & 0xFF}, + {0xce90 & 0xFF, 0xce90 & 0xFF}, + {0xce91 & 0xFF, 0xceab & 0xFF}, + {0xceac & 0xFF, 0xceac & 0xFF}, + {0xcead & 0xFF, 0xcec7 & 0xFF}, + {0xcec8 & 0xFF, 0xcec8 & 0xFF}, + {0xcec9 & 0xFF, 0xcee3 & 0xFF}, + {0xcee4 & 0xFF, 0xcee4 & 0xFF}, + {0xcee5 & 0xFF, 0xceff & 0xFF}, + {0xcf00 & 0xFF, 0xcf00 & 0xFF}, + {0xcf01 & 0xFF, 0xcf1b & 0xFF}, + {0xcf1c & 0xFF, 0xcf1c & 0xFF}, + {0xcf1d & 0xFF, 0xcf37 & 0xFF}, + {0xcf38 & 0xFF, 0xcf38 & 0xFF}, + {0xcf39 & 0xFF, 0xcf53 & 0xFF}, + {0xcf54 & 0xFF, 0xcf54 & 0xFF}, + {0xcf55 & 0xFF, 0xcf6f & 0xFF}, + {0xcf70 & 0xFF, 0xcf70 & 0xFF}, + {0xcf71 & 0xFF, 0xcf8b & 0xFF}, + {0xcf8c & 0xFF, 0xcf8c & 0xFF}, + {0xcf8d & 0xFF, 0xcfa7 & 0xFF}, + {0xcfa8 & 0xFF, 0xcfa8 & 0xFF}, + {0xcfa9 & 0xFF, 0xcfc3 & 0xFF}, + {0xcfc4 & 0xFF, 0xcfc4 & 0xFF}, + {0xcfc5 & 0xFF, 0xcfdf & 0xFF}, + {0xcfe0 & 0xFF, 0xcfe0 & 0xFF}, + {0xcfe1 & 0xFF, 0xcffb & 0xFF}, + {0xcffc & 0xFF, 0xcffc & 0xFF}, + {0xcffd & 0xFF, 0xcfff & 0xFF}, + {0xd000 & 0xFF, 0xd017 & 0xFF}, + {0xd018 & 0xFF, 0xd018 & 0xFF}, + {0xd019 & 0xFF, 0xd033 & 0xFF}, + {0xd034 & 0xFF, 0xd034 & 0xFF}, + {0xd035 & 0xFF, 0xd04f & 0xFF}, + {0xd050 & 0xFF, 0xd050 & 0xFF}, + {0xd051 & 0xFF, 0xd06b & 0xFF}, + {0xd06c & 0xFF, 0xd06c & 0xFF}, + {0xd06d & 0xFF, 0xd087 & 0xFF}, + {0xd088 & 0xFF, 0xd088 & 0xFF}, + {0xd089 & 0xFF, 0xd0a3 & 0xFF}, + {0xd0a4 & 0xFF, 0xd0a4 & 0xFF}, + {0xd0a5 & 0xFF, 0xd0bf & 0xFF}, + {0xd0c0 & 0xFF, 0xd0c0 & 0xFF}, + {0xd0c1 & 0xFF, 0xd0db & 0xFF}, + {0xd0dc & 0xFF, 0xd0dc & 0xFF}, + {0xd0dd & 0xFF, 0xd0f7 & 0xFF}, + {0xd0f8 & 0xFF, 0xd0f8 & 0xFF}, + {0xd0f9 & 0xFF, 0xd0ff & 0xFF}, + {0xd100 & 0xFF, 0xd113 & 0xFF}, + {0xd114 & 0xFF, 0xd114 & 0xFF}, + {0xd115 & 0xFF, 0xd12f & 0xFF}, + {0xd130 & 0xFF, 0xd130 & 0xFF}, + {0xd131 & 0xFF, 0xd14b & 0xFF}, + {0xd14c & 0xFF, 0xd14c & 0xFF}, + {0xd14d & 0xFF, 0xd167 & 0xFF}, + {0xd168 & 0xFF, 0xd168 & 0xFF}, + {0xd169 & 0xFF, 0xd183 & 0xFF}, + {0xd184 & 0xFF, 0xd184 & 0xFF}, + {0xd185 & 0xFF, 0xd19f & 0xFF}, + {0xd1a0 & 0xFF, 0xd1a0 & 0xFF}, + {0xd1a1 & 0xFF, 0xd1bb & 0xFF}, + {0xd1bc & 0xFF, 0xd1bc & 0xFF}, + {0xd1bd & 0xFF, 0xd1d7 & 0xFF}, + {0xd1d8 & 0xFF, 0xd1d8 & 0xFF}, + {0xd1d9 & 0xFF, 0xd1f3 & 0xFF}, + {0xd1f4 & 0xFF, 0xd1f4 & 0xFF}, + {0xd1f5 & 0xFF, 0xd1ff & 0xFF}, + {0xd200 & 0xFF, 0xd20f & 0xFF}, + {0xd210 & 0xFF, 0xd210 & 0xFF}, + {0xd211 & 0xFF, 0xd22b & 0xFF}, + {0xd22c & 0xFF, 0xd22c & 0xFF}, + {0xd22d & 0xFF, 0xd247 & 0xFF}, + {0xd248 & 0xFF, 0xd248 & 0xFF}, + {0xd249 & 0xFF, 0xd263 & 0xFF}, + {0xd264 & 0xFF, 0xd264 & 0xFF}, + {0xd265 & 0xFF, 0xd27f & 0xFF}, + {0xd280 & 0xFF, 0xd280 & 0xFF}, + {0xd281 & 0xFF, 0xd29b & 0xFF}, + {0xd29c & 0xFF, 0xd29c & 0xFF}, + {0xd29d & 0xFF, 0xd2b7 & 0xFF}, + {0xd2b8 & 0xFF, 0xd2b8 & 0xFF}, + {0xd2b9 & 0xFF, 0xd2d3 & 0xFF}, + {0xd2d4 & 0xFF, 0xd2d4 & 0xFF}, + {0xd2d5 & 0xFF, 0xd2ef & 0xFF}, + {0xd2f0 & 0xFF, 0xd2f0 & 0xFF}, + {0xd2f1 & 0xFF, 0xd2ff & 0xFF}, + {0xd300 & 0xFF, 0xd30b & 0xFF}, + {0xd30c & 0xFF, 0xd30c & 0xFF}, + {0xd30d & 0xFF, 0xd327 & 0xFF}, + {0xd328 & 0xFF, 0xd328 & 0xFF}, + {0xd329 & 0xFF, 0xd343 & 0xFF}, + {0xd344 & 0xFF, 0xd344 & 0xFF}, + {0xd345 & 0xFF, 0xd35f & 0xFF}, + {0xd360 & 0xFF, 0xd360 & 0xFF}, + {0xd361 & 0xFF, 0xd37b & 0xFF}, + {0xd37c & 0xFF, 0xd37c & 0xFF}, + {0xd37d & 0xFF, 0xd397 & 0xFF}, + {0xd398 & 0xFF, 0xd398 & 0xFF}, + {0xd399 & 0xFF, 0xd3b3 & 0xFF}, + {0xd3b4 & 0xFF, 0xd3b4 & 0xFF}, + {0xd3b5 & 0xFF, 0xd3cf & 0xFF}, + {0xd3d0 & 0xFF, 0xd3d0 & 0xFF}, + {0xd3d1 & 0xFF, 0xd3eb & 0xFF}, + {0xd3ec & 0xFF, 0xd3ec & 0xFF}, + {0xd3ed & 0xFF, 0xd3ff & 0xFF}, + {0xd400 & 0xFF, 0xd407 & 0xFF}, + {0xd408 & 0xFF, 0xd408 & 0xFF}, + {0xd409 & 0xFF, 0xd423 & 0xFF}, + {0xd424 & 0xFF, 0xd424 & 0xFF}, + {0xd425 & 0xFF, 0xd43f & 0xFF}, + {0xd440 & 0xFF, 0xd440 & 0xFF}, + {0xd441 & 0xFF, 0xd45b & 0xFF}, + {0xd45c & 0xFF, 0xd45c & 0xFF}, + {0xd45d & 0xFF, 0xd477 & 0xFF}, + {0xd478 & 0xFF, 0xd478 & 0xFF}, + {0xd479 & 0xFF, 0xd493 & 0xFF}, + {0xd494 & 0xFF, 0xd494 & 0xFF}, + {0xd495 & 0xFF, 0xd4af & 0xFF}, + {0xd4b0 & 0xFF, 0xd4b0 & 0xFF}, + {0xd4b1 & 0xFF, 0xd4cb & 0xFF}, + {0xd4cc & 0xFF, 0xd4cc & 0xFF}, + {0xd4cd & 0xFF, 0xd4e7 & 0xFF}, + {0xd4e8 & 0xFF, 0xd4e8 & 0xFF}, + {0xd4e9 & 0xFF, 0xd4ff & 0xFF}, + {0xd500 & 0xFF, 0xd503 & 0xFF}, + {0xd504 & 0xFF, 0xd504 & 0xFF}, + {0xd505 & 0xFF, 0xd51f & 0xFF}, + {0xd520 & 0xFF, 0xd520 & 0xFF}, + {0xd521 & 0xFF, 0xd53b & 0xFF}, + {0xd53c & 0xFF, 0xd53c & 0xFF}, + {0xd53d & 0xFF, 0xd557 & 0xFF}, + {0xd558 & 0xFF, 0xd558 & 0xFF}, + {0xd559 & 0xFF, 0xd573 & 0xFF}, + {0xd574 & 0xFF, 0xd574 & 0xFF}, + {0xd575 & 0xFF, 0xd58f & 0xFF}, + {0xd590 & 0xFF, 0xd590 & 0xFF}, + {0xd591 & 0xFF, 0xd5ab & 0xFF}, + {0xd5ac & 0xFF, 0xd5ac & 0xFF}, + {0xd5ad & 0xFF, 0xd5c7 & 0xFF}, + {0xd5c8 & 0xFF, 0xd5c8 & 0xFF}, + {0xd5c9 & 0xFF, 0xd5e3 & 0xFF}, + {0xd5e4 & 0xFF, 0xd5e4 & 0xFF}, + {0xd5e5 & 0xFF, 0xd5ff & 0xFF}, + {0xd600 & 0xFF, 0xd600 & 0xFF}, + {0xd601 & 0xFF, 0xd61b & 0xFF}, + {0xd61c & 0xFF, 0xd61c & 0xFF}, + {0xd61d & 0xFF, 0xd637 & 0xFF}, + {0xd638 & 0xFF, 0xd638 & 0xFF}, + {0xd639 & 0xFF, 0xd653 & 0xFF}, + {0xd654 & 0xFF, 0xd654 & 0xFF}, + {0xd655 & 0xFF, 0xd66f & 0xFF}, + {0xd670 & 0xFF, 0xd670 & 0xFF}, + {0xd671 & 0xFF, 0xd68b & 0xFF}, + {0xd68c & 0xFF, 0xd68c & 0xFF}, + {0xd68d & 0xFF, 0xd6a7 & 0xFF}, + {0xd6a8 & 0xFF, 0xd6a8 & 0xFF}, + {0xd6a9 & 0xFF, 0xd6c3 & 0xFF}, + {0xd6c4 & 0xFF, 0xd6c4 & 0xFF}, + {0xd6c5 & 0xFF, 0xd6df & 0xFF}, + {0xd6e0 & 0xFF, 0xd6e0 & 0xFF}, + {0xd6e1 & 0xFF, 0xd6fb & 0xFF}, + {0xd6fc & 0xFF, 0xd6fc & 0xFF}, + {0xd6fd & 0xFF, 0xd6ff & 0xFF}, + {0xd700 & 0xFF, 0xd717 & 0xFF}, + {0xd718 & 0xFF, 0xd718 & 0xFF}, + {0xd719 & 0xFF, 0xd733 & 0xFF}, + {0xd734 & 0xFF, 0xd734 & 0xFF}, + {0xd735 & 0xFF, 0xd74f & 0xFF}, + {0xd750 & 0xFF, 0xd750 & 0xFF}, + {0xd751 & 0xFF, 0xd76b & 0xFF}, + {0xd76c & 0xFF, 0xd76c & 0xFF}, + {0xd76d & 0xFF, 0xd787 & 0xFF}, + {0xd788 & 0xFF, 0xd788 & 0xFF}, + {0xd789 & 0xFF, 0xd7a3 & 0xFF}, + {0xd7b0 & 0xFF, 0xd7c6 & 0xFF}, + {0xd7cb & 0xFF, 0xd7fb & 0xFF}, + {0xfb1e & 0xFF, 0xfb1e & 0xFF}, + {0xfe00 & 0xFF, 0xfe0f & 0xFF}, + {0xfe20 & 0xFF, 0xfe26 & 0xFF}, + {0xfeff & 0xFF, 0xfeff & 0xFF}, + {0xff9e & 0xFF, 0xff9f & 0xFF}, + {0xfff9 & 0xFF, 0xfffb & 0xFF}, + {0x101fd & 0xFF, 0x101fd & 0xFF}, + {0x10a01 & 0xFF, 0x10a03 & 0xFF}, + {0x10a05 & 0xFF, 0x10a06 & 0xFF}, + {0x10a0c & 0xFF, 0x10a0f & 0xFF}, + {0x10a38 & 0xFF, 0x10a3a & 0xFF}, + {0x10a3f & 0xFF, 0x10a3f & 0xFF}, + {0x11000 & 0xFF, 0x11000 & 0xFF}, + {0x11001 & 0xFF, 0x11001 & 0xFF}, + {0x11002 & 0xFF, 0x11002 & 0xFF}, + {0x11038 & 0xFF, 0x11046 & 0xFF}, + {0x11080 & 0xFF, 0x11081 & 0xFF}, + {0x11082 & 0xFF, 0x11082 & 0xFF}, + {0x110b0 & 0xFF, 0x110b2 & 0xFF}, + {0x110b3 & 0xFF, 0x110b6 & 0xFF}, + {0x110b7 & 0xFF, 0x110b8 & 0xFF}, + {0x110b9 & 0xFF, 0x110ba & 0xFF}, + {0x110bd & 0xFF, 0x110bd & 0xFF}, + {0x1d165 & 0xFF, 0x1d165 & 0xFF}, + {0x1d166 & 0xFF, 0x1d166 & 0xFF}, + {0x1d167 & 0xFF, 0x1d169 & 0xFF}, + {0x1d16d & 0xFF, 0x1d16d & 0xFF}, + {0x1d16e & 0xFF, 0x1d172 & 0xFF}, + {0x1d173 & 0xFF, 0x1d17a & 0xFF}, + {0x1d17b & 0xFF, 0x1d182 & 0xFF}, + {0x1d185 & 0xFF, 0x1d18b & 0xFF}, + {0x1d1aa & 0xFF, 0x1d1ad & 0xFF}, + {0x1d242 & 0xFF, 0x1d244 & 0xFF}, + {0xe0001 & 0xFF, 0xe0001 & 0xFF}, + {0xe0020 & 0xFF, 0xe007f & 0xFF}, + {0xe0100 & 0xFF, 0xe01ef & 0xFF}}; + +static const uint8_t unicode_classtab[]={ + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_LF, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_CR, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Prepend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Prepend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_L, + UNICODE_GRAPHEMEBREAK_V, + UNICODE_GRAPHEMEBREAK_T, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_L, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Prepend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Prepend, + UNICODE_GRAPHEMEBREAK_Prepend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_LV, + UNICODE_GRAPHEMEBREAK_LVT, + UNICODE_GRAPHEMEBREAK_V, + UNICODE_GRAPHEMEBREAK_T, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_SpacingMark, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Extend, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Control, + UNICODE_GRAPHEMEBREAK_Extend}; + +static const size_t unicode_indextab[]={ + 0, + 7, + 7, + 7, + 8, + 9, + 14, + 23, + 28, + 33, + 56, + 76, + 96, + 116, + 134, + 148, + 160, + 182, + 185, + 185, + 186, + 186, + 186, + 186, + 198, + 200, + 210, + 224, + 250, + 260, + 262, + 262, + 262, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 269, + 270, + 272, + 272, + 272, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 274, + 277, + 277, + 287, + 299, + 316, + 323, + 343, + 362, + 381, + 400, + 419, + 438, + 457, + 477, + 496, + 515, + 534, + 553, + 572, + 591, + 611, + 630, + 649, + 668, + 687, + 706, + 725, + 745, + 764, + 783, + 802, + 821, + 840, + 859, + 879, + 898, + 917, + 936, + 955, + 974, + 993, + 1013, + 1032, + 1051, + 1070, + 1089, + 1108, + 1127, + 1147, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1160, + 1161, + 1161, + 1161, + 1164, + 1166, + 1166, + 1167, + 1167, + 1167, + 1167, + 1167, + 1167, + 1167, + 1167, + 1167, + 1172, + 1172, + 1172, + 1172, + 1172, + 1172, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1183, + 1192, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1193, + 1195, + 1196}; + diff --git a/unicode/graphemetest.c b/unicode/graphemetest.c new file mode 100644 index 0000000..58bc184 --- /dev/null +++ b/unicode/graphemetest.c @@ -0,0 +1,24 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> + + +int main(int argc, char **argv) +{ + if (argc >= 3) + { + printf("%d\n", + unicode_grapheme_break(strtol(argv[1], NULL, 0), + strtol(argv[2], NULL, 0))); + } + return (0); +} diff --git a/unicode/linebreaktab.h b/unicode/linebreaktab.h new file mode 100644 index 0000000..7c58d30 --- /dev/null +++ b/unicode/linebreaktab.h @@ -0,0 +1,9071 @@ +static const uint8_t unicode_rangetab[][2]={ + {0x0000 & 0xFF, 0x0008 & 0xFF}, + {0x0009 & 0xFF, 0x0009 & 0xFF}, + {0x000a & 0xFF, 0x000a & 0xFF}, + {0x000b & 0xFF, 0x000c & 0xFF}, + {0x000d & 0xFF, 0x000d & 0xFF}, + {0x000e & 0xFF, 0x001f & 0xFF}, + {0x0020 & 0xFF, 0x0020 & 0xFF}, + {0x0021 & 0xFF, 0x0021 & 0xFF}, + {0x0022 & 0xFF, 0x0022 & 0xFF}, + {0x0023 & 0xFF, 0x0023 & 0xFF}, + {0x0024 & 0xFF, 0x0024 & 0xFF}, + {0x0025 & 0xFF, 0x0025 & 0xFF}, + {0x0026 & 0xFF, 0x0026 & 0xFF}, + {0x0027 & 0xFF, 0x0027 & 0xFF}, + {0x0028 & 0xFF, 0x0028 & 0xFF}, + {0x0029 & 0xFF, 0x0029 & 0xFF}, + {0x002a & 0xFF, 0x002a & 0xFF}, + {0x002b & 0xFF, 0x002b & 0xFF}, + {0x002c & 0xFF, 0x002c & 0xFF}, + {0x002d & 0xFF, 0x002d & 0xFF}, + {0x002e & 0xFF, 0x002e & 0xFF}, + {0x002f & 0xFF, 0x002f & 0xFF}, + {0x0030 & 0xFF, 0x0039 & 0xFF}, + {0x003a & 0xFF, 0x003b & 0xFF}, + {0x003c & 0xFF, 0x003e & 0xFF}, + {0x003f & 0xFF, 0x003f & 0xFF}, + {0x0040 & 0xFF, 0x005a & 0xFF}, + {0x005b & 0xFF, 0x005b & 0xFF}, + {0x005c & 0xFF, 0x005c & 0xFF}, + {0x005d & 0xFF, 0x005d & 0xFF}, + {0x005e & 0xFF, 0x007a & 0xFF}, + {0x007b & 0xFF, 0x007b & 0xFF}, + {0x007c & 0xFF, 0x007c & 0xFF}, + {0x007d & 0xFF, 0x007d & 0xFF}, + {0x007e & 0xFF, 0x007e & 0xFF}, + {0x007f & 0xFF, 0x0084 & 0xFF}, + {0x0085 & 0xFF, 0x0085 & 0xFF}, + {0x0086 & 0xFF, 0x009f & 0xFF}, + {0x00a0 & 0xFF, 0x00a0 & 0xFF}, + {0x00a1 & 0xFF, 0x00a1 & 0xFF}, + {0x00a2 & 0xFF, 0x00a2 & 0xFF}, + {0x00a3 & 0xFF, 0x00a5 & 0xFF}, + {0x00a6 & 0xFF, 0x00aa & 0xFF}, + {0x00ab & 0xFF, 0x00ab & 0xFF}, + {0x00ac & 0xFF, 0x00ac & 0xFF}, + {0x00ad & 0xFF, 0x00ad & 0xFF}, + {0x00ae & 0xFF, 0x00af & 0xFF}, + {0x00b0 & 0xFF, 0x00b0 & 0xFF}, + {0x00b1 & 0xFF, 0x00b1 & 0xFF}, + {0x00b2 & 0xFF, 0x00b3 & 0xFF}, + {0x00b4 & 0xFF, 0x00b4 & 0xFF}, + {0x00b5 & 0xFF, 0x00ba & 0xFF}, + {0x00bb & 0xFF, 0x00bb & 0xFF}, + {0x00bc & 0xFF, 0x00be & 0xFF}, + {0x00bf & 0xFF, 0x00bf & 0xFF}, + {0x00c0 & 0xFF, 0x00ff & 0xFF}, + {0x0100 & 0xFF, 0x01ff & 0xFF}, + {0x0200 & 0xFF, 0x02c7 & 0xFF}, + {0x02c8 & 0xFF, 0x02c8 & 0xFF}, + {0x02c9 & 0xFF, 0x02cb & 0xFF}, + {0x02cc & 0xFF, 0x02cc & 0xFF}, + {0x02cd & 0xFF, 0x02de & 0xFF}, + {0x02df & 0xFF, 0x02df & 0xFF}, + {0x02e0 & 0xFF, 0x02ff & 0xFF}, + {0x0300 & 0xFF, 0x034e & 0xFF}, + {0x034f & 0xFF, 0x034f & 0xFF}, + {0x0350 & 0xFF, 0x035b & 0xFF}, + {0x035c & 0xFF, 0x0362 & 0xFF}, + {0x0363 & 0xFF, 0x036f & 0xFF}, + {0x0370 & 0xFF, 0x0377 & 0xFF}, + {0x037a & 0xFF, 0x037d & 0xFF}, + {0x037e & 0xFF, 0x037e & 0xFF}, + {0x0384 & 0xFF, 0x038a & 0xFF}, + {0x038c & 0xFF, 0x038c & 0xFF}, + {0x038e & 0xFF, 0x03a1 & 0xFF}, + {0x03a3 & 0xFF, 0x03ff & 0xFF}, + {0x0400 & 0xFF, 0x0482 & 0xFF}, + {0x0483 & 0xFF, 0x0489 & 0xFF}, + {0x048a & 0xFF, 0x04ff & 0xFF}, + {0x0500 & 0xFF, 0x0527 & 0xFF}, + {0x0531 & 0xFF, 0x0556 & 0xFF}, + {0x0559 & 0xFF, 0x055f & 0xFF}, + {0x0561 & 0xFF, 0x0587 & 0xFF}, + {0x0589 & 0xFF, 0x0589 & 0xFF}, + {0x058a & 0xFF, 0x058a & 0xFF}, + {0x0591 & 0xFF, 0x05bd & 0xFF}, + {0x05be & 0xFF, 0x05be & 0xFF}, + {0x05bf & 0xFF, 0x05bf & 0xFF}, + {0x05c0 & 0xFF, 0x05c0 & 0xFF}, + {0x05c1 & 0xFF, 0x05c2 & 0xFF}, + {0x05c3 & 0xFF, 0x05c3 & 0xFF}, + {0x05c4 & 0xFF, 0x05c5 & 0xFF}, + {0x05c6 & 0xFF, 0x05c6 & 0xFF}, + {0x05c7 & 0xFF, 0x05c7 & 0xFF}, + {0x05d0 & 0xFF, 0x05ea & 0xFF}, + {0x05f0 & 0xFF, 0x05f4 & 0xFF}, + {0x0600 & 0xFF, 0x0603 & 0xFF}, + {0x0606 & 0xFF, 0x0608 & 0xFF}, + {0x0609 & 0xFF, 0x060b & 0xFF}, + {0x060c & 0xFF, 0x060d & 0xFF}, + {0x060e & 0xFF, 0x060f & 0xFF}, + {0x0610 & 0xFF, 0x061a & 0xFF}, + {0x061b & 0xFF, 0x061b & 0xFF}, + {0x061e & 0xFF, 0x061f & 0xFF}, + {0x0620 & 0xFF, 0x064a & 0xFF}, + {0x064b & 0xFF, 0x065f & 0xFF}, + {0x0660 & 0xFF, 0x0669 & 0xFF}, + {0x066a & 0xFF, 0x066a & 0xFF}, + {0x066b & 0xFF, 0x066c & 0xFF}, + {0x066d & 0xFF, 0x066f & 0xFF}, + {0x0670 & 0xFF, 0x0670 & 0xFF}, + {0x0671 & 0xFF, 0x06d3 & 0xFF}, + {0x06d4 & 0xFF, 0x06d4 & 0xFF}, + {0x06d5 & 0xFF, 0x06d5 & 0xFF}, + {0x06d6 & 0xFF, 0x06dc & 0xFF}, + {0x06dd & 0xFF, 0x06de & 0xFF}, + {0x06df & 0xFF, 0x06e4 & 0xFF}, + {0x06e5 & 0xFF, 0x06e6 & 0xFF}, + {0x06e7 & 0xFF, 0x06e8 & 0xFF}, + {0x06e9 & 0xFF, 0x06e9 & 0xFF}, + {0x06ea & 0xFF, 0x06ed & 0xFF}, + {0x06ee & 0xFF, 0x06ef & 0xFF}, + {0x06f0 & 0xFF, 0x06f9 & 0xFF}, + {0x06fa & 0xFF, 0x06ff & 0xFF}, + {0x0700 & 0xFF, 0x070d & 0xFF}, + {0x070f & 0xFF, 0x0710 & 0xFF}, + {0x0711 & 0xFF, 0x0711 & 0xFF}, + {0x0712 & 0xFF, 0x072f & 0xFF}, + {0x0730 & 0xFF, 0x074a & 0xFF}, + {0x074d & 0xFF, 0x07a5 & 0xFF}, + {0x07a6 & 0xFF, 0x07b0 & 0xFF}, + {0x07b1 & 0xFF, 0x07b1 & 0xFF}, + {0x07c0 & 0xFF, 0x07c9 & 0xFF}, + {0x07ca & 0xFF, 0x07ea & 0xFF}, + {0x07eb & 0xFF, 0x07f3 & 0xFF}, + {0x07f4 & 0xFF, 0x07f7 & 0xFF}, + {0x07f8 & 0xFF, 0x07f8 & 0xFF}, + {0x07f9 & 0xFF, 0x07f9 & 0xFF}, + {0x07fa & 0xFF, 0x07fa & 0xFF}, + {0x0800 & 0xFF, 0x0815 & 0xFF}, + {0x0816 & 0xFF, 0x0819 & 0xFF}, + {0x081a & 0xFF, 0x081a & 0xFF}, + {0x081b & 0xFF, 0x0823 & 0xFF}, + {0x0824 & 0xFF, 0x0824 & 0xFF}, + {0x0825 & 0xFF, 0x0827 & 0xFF}, + {0x0828 & 0xFF, 0x0828 & 0xFF}, + {0x0829 & 0xFF, 0x082d & 0xFF}, + {0x0830 & 0xFF, 0x083e & 0xFF}, + {0x0840 & 0xFF, 0x0858 & 0xFF}, + {0x0859 & 0xFF, 0x085b & 0xFF}, + {0x085e & 0xFF, 0x085e & 0xFF}, + {0x0900 & 0xFF, 0x0903 & 0xFF}, + {0x0904 & 0xFF, 0x0939 & 0xFF}, + {0x093a & 0xFF, 0x093c & 0xFF}, + {0x093d & 0xFF, 0x093d & 0xFF}, + {0x093e & 0xFF, 0x094f & 0xFF}, + {0x0950 & 0xFF, 0x0950 & 0xFF}, + {0x0951 & 0xFF, 0x0957 & 0xFF}, + {0x0958 & 0xFF, 0x0961 & 0xFF}, + {0x0962 & 0xFF, 0x0963 & 0xFF}, + {0x0964 & 0xFF, 0x0965 & 0xFF}, + {0x0966 & 0xFF, 0x096f & 0xFF}, + {0x0970 & 0xFF, 0x0977 & 0xFF}, + {0x0979 & 0xFF, 0x097f & 0xFF}, + {0x0981 & 0xFF, 0x0983 & 0xFF}, + {0x0985 & 0xFF, 0x098c & 0xFF}, + {0x098f & 0xFF, 0x0990 & 0xFF}, + {0x0993 & 0xFF, 0x09a8 & 0xFF}, + {0x09aa & 0xFF, 0x09b0 & 0xFF}, + {0x09b2 & 0xFF, 0x09b2 & 0xFF}, + {0x09b6 & 0xFF, 0x09b9 & 0xFF}, + {0x09bc & 0xFF, 0x09bc & 0xFF}, + {0x09bd & 0xFF, 0x09bd & 0xFF}, + {0x09be & 0xFF, 0x09c4 & 0xFF}, + {0x09c7 & 0xFF, 0x09c8 & 0xFF}, + {0x09cb & 0xFF, 0x09cd & 0xFF}, + {0x09ce & 0xFF, 0x09ce & 0xFF}, + {0x09d7 & 0xFF, 0x09d7 & 0xFF}, + {0x09dc & 0xFF, 0x09dd & 0xFF}, + {0x09df & 0xFF, 0x09e1 & 0xFF}, + {0x09e2 & 0xFF, 0x09e3 & 0xFF}, + {0x09e6 & 0xFF, 0x09ef & 0xFF}, + {0x09f0 & 0xFF, 0x09f1 & 0xFF}, + {0x09f2 & 0xFF, 0x09f3 & 0xFF}, + {0x09f4 & 0xFF, 0x09f8 & 0xFF}, + {0x09f9 & 0xFF, 0x09f9 & 0xFF}, + {0x09fa & 0xFF, 0x09fa & 0xFF}, + {0x09fb & 0xFF, 0x09fb & 0xFF}, + {0x0a01 & 0xFF, 0x0a03 & 0xFF}, + {0x0a05 & 0xFF, 0x0a0a & 0xFF}, + {0x0a0f & 0xFF, 0x0a10 & 0xFF}, + {0x0a13 & 0xFF, 0x0a28 & 0xFF}, + {0x0a2a & 0xFF, 0x0a30 & 0xFF}, + {0x0a32 & 0xFF, 0x0a33 & 0xFF}, + {0x0a35 & 0xFF, 0x0a36 & 0xFF}, + {0x0a38 & 0xFF, 0x0a39 & 0xFF}, + {0x0a3c & 0xFF, 0x0a3c & 0xFF}, + {0x0a3e & 0xFF, 0x0a42 & 0xFF}, + {0x0a47 & 0xFF, 0x0a48 & 0xFF}, + {0x0a4b & 0xFF, 0x0a4d & 0xFF}, + {0x0a51 & 0xFF, 0x0a51 & 0xFF}, + {0x0a59 & 0xFF, 0x0a5c & 0xFF}, + {0x0a5e & 0xFF, 0x0a5e & 0xFF}, + {0x0a66 & 0xFF, 0x0a6f & 0xFF}, + {0x0a70 & 0xFF, 0x0a71 & 0xFF}, + {0x0a72 & 0xFF, 0x0a74 & 0xFF}, + {0x0a75 & 0xFF, 0x0a75 & 0xFF}, + {0x0a81 & 0xFF, 0x0a83 & 0xFF}, + {0x0a85 & 0xFF, 0x0a8d & 0xFF}, + {0x0a8f & 0xFF, 0x0a91 & 0xFF}, + {0x0a93 & 0xFF, 0x0aa8 & 0xFF}, + {0x0aaa & 0xFF, 0x0ab0 & 0xFF}, + {0x0ab2 & 0xFF, 0x0ab3 & 0xFF}, + {0x0ab5 & 0xFF, 0x0ab9 & 0xFF}, + {0x0abc & 0xFF, 0x0abc & 0xFF}, + {0x0abd & 0xFF, 0x0abd & 0xFF}, + {0x0abe & 0xFF, 0x0ac5 & 0xFF}, + {0x0ac7 & 0xFF, 0x0ac9 & 0xFF}, + {0x0acb & 0xFF, 0x0acd & 0xFF}, + {0x0ad0 & 0xFF, 0x0ad0 & 0xFF}, + {0x0ae0 & 0xFF, 0x0ae1 & 0xFF}, + {0x0ae2 & 0xFF, 0x0ae3 & 0xFF}, + {0x0ae6 & 0xFF, 0x0aef & 0xFF}, + {0x0af1 & 0xFF, 0x0af1 & 0xFF}, + {0x0b01 & 0xFF, 0x0b03 & 0xFF}, + {0x0b05 & 0xFF, 0x0b0c & 0xFF}, + {0x0b0f & 0xFF, 0x0b10 & 0xFF}, + {0x0b13 & 0xFF, 0x0b28 & 0xFF}, + {0x0b2a & 0xFF, 0x0b30 & 0xFF}, + {0x0b32 & 0xFF, 0x0b33 & 0xFF}, + {0x0b35 & 0xFF, 0x0b39 & 0xFF}, + {0x0b3c & 0xFF, 0x0b3c & 0xFF}, + {0x0b3d & 0xFF, 0x0b3d & 0xFF}, + {0x0b3e & 0xFF, 0x0b44 & 0xFF}, + {0x0b47 & 0xFF, 0x0b48 & 0xFF}, + {0x0b4b & 0xFF, 0x0b4d & 0xFF}, + {0x0b56 & 0xFF, 0x0b57 & 0xFF}, + {0x0b5c & 0xFF, 0x0b5d & 0xFF}, + {0x0b5f & 0xFF, 0x0b61 & 0xFF}, + {0x0b62 & 0xFF, 0x0b63 & 0xFF}, + {0x0b66 & 0xFF, 0x0b6f & 0xFF}, + {0x0b70 & 0xFF, 0x0b77 & 0xFF}, + {0x0b82 & 0xFF, 0x0b82 & 0xFF}, + {0x0b83 & 0xFF, 0x0b83 & 0xFF}, + {0x0b85 & 0xFF, 0x0b8a & 0xFF}, + {0x0b8e & 0xFF, 0x0b90 & 0xFF}, + {0x0b92 & 0xFF, 0x0b95 & 0xFF}, + {0x0b99 & 0xFF, 0x0b9a & 0xFF}, + {0x0b9c & 0xFF, 0x0b9c & 0xFF}, + {0x0b9e & 0xFF, 0x0b9f & 0xFF}, + {0x0ba3 & 0xFF, 0x0ba4 & 0xFF}, + {0x0ba8 & 0xFF, 0x0baa & 0xFF}, + {0x0bae & 0xFF, 0x0bb9 & 0xFF}, + {0x0bbe & 0xFF, 0x0bc2 & 0xFF}, + {0x0bc6 & 0xFF, 0x0bc8 & 0xFF}, + {0x0bca & 0xFF, 0x0bcd & 0xFF}, + {0x0bd0 & 0xFF, 0x0bd0 & 0xFF}, + {0x0bd7 & 0xFF, 0x0bd7 & 0xFF}, + {0x0be6 & 0xFF, 0x0bef & 0xFF}, + {0x0bf0 & 0xFF, 0x0bf8 & 0xFF}, + {0x0bf9 & 0xFF, 0x0bf9 & 0xFF}, + {0x0bfa & 0xFF, 0x0bfa & 0xFF}, + {0x0c01 & 0xFF, 0x0c03 & 0xFF}, + {0x0c05 & 0xFF, 0x0c0c & 0xFF}, + {0x0c0e & 0xFF, 0x0c10 & 0xFF}, + {0x0c12 & 0xFF, 0x0c28 & 0xFF}, + {0x0c2a & 0xFF, 0x0c33 & 0xFF}, + {0x0c35 & 0xFF, 0x0c39 & 0xFF}, + {0x0c3d & 0xFF, 0x0c3d & 0xFF}, + {0x0c3e & 0xFF, 0x0c44 & 0xFF}, + {0x0c46 & 0xFF, 0x0c48 & 0xFF}, + {0x0c4a & 0xFF, 0x0c4d & 0xFF}, + {0x0c55 & 0xFF, 0x0c56 & 0xFF}, + {0x0c58 & 0xFF, 0x0c59 & 0xFF}, + {0x0c60 & 0xFF, 0x0c61 & 0xFF}, + {0x0c62 & 0xFF, 0x0c63 & 0xFF}, + {0x0c66 & 0xFF, 0x0c6f & 0xFF}, + {0x0c78 & 0xFF, 0x0c7f & 0xFF}, + {0x0c82 & 0xFF, 0x0c83 & 0xFF}, + {0x0c85 & 0xFF, 0x0c8c & 0xFF}, + {0x0c8e & 0xFF, 0x0c90 & 0xFF}, + {0x0c92 & 0xFF, 0x0ca8 & 0xFF}, + {0x0caa & 0xFF, 0x0cb3 & 0xFF}, + {0x0cb5 & 0xFF, 0x0cb9 & 0xFF}, + {0x0cbc & 0xFF, 0x0cbc & 0xFF}, + {0x0cbd & 0xFF, 0x0cbd & 0xFF}, + {0x0cbe & 0xFF, 0x0cc4 & 0xFF}, + {0x0cc6 & 0xFF, 0x0cc8 & 0xFF}, + {0x0cca & 0xFF, 0x0ccd & 0xFF}, + {0x0cd5 & 0xFF, 0x0cd6 & 0xFF}, + {0x0cde & 0xFF, 0x0cde & 0xFF}, + {0x0ce0 & 0xFF, 0x0ce1 & 0xFF}, + {0x0ce2 & 0xFF, 0x0ce3 & 0xFF}, + {0x0ce6 & 0xFF, 0x0cef & 0xFF}, + {0x0cf1 & 0xFF, 0x0cf2 & 0xFF}, + {0x0d02 & 0xFF, 0x0d03 & 0xFF}, + {0x0d05 & 0xFF, 0x0d0c & 0xFF}, + {0x0d0e & 0xFF, 0x0d10 & 0xFF}, + {0x0d12 & 0xFF, 0x0d3a & 0xFF}, + {0x0d3d & 0xFF, 0x0d3d & 0xFF}, + {0x0d3e & 0xFF, 0x0d44 & 0xFF}, + {0x0d46 & 0xFF, 0x0d48 & 0xFF}, + {0x0d4a & 0xFF, 0x0d4d & 0xFF}, + {0x0d4e & 0xFF, 0x0d4e & 0xFF}, + {0x0d57 & 0xFF, 0x0d57 & 0xFF}, + {0x0d60 & 0xFF, 0x0d61 & 0xFF}, + {0x0d62 & 0xFF, 0x0d63 & 0xFF}, + {0x0d66 & 0xFF, 0x0d6f & 0xFF}, + {0x0d70 & 0xFF, 0x0d75 & 0xFF}, + {0x0d79 & 0xFF, 0x0d79 & 0xFF}, + {0x0d7a & 0xFF, 0x0d7f & 0xFF}, + {0x0d82 & 0xFF, 0x0d83 & 0xFF}, + {0x0d85 & 0xFF, 0x0d96 & 0xFF}, + {0x0d9a & 0xFF, 0x0db1 & 0xFF}, + {0x0db3 & 0xFF, 0x0dbb & 0xFF}, + {0x0dbd & 0xFF, 0x0dbd & 0xFF}, + {0x0dc0 & 0xFF, 0x0dc6 & 0xFF}, + {0x0dca & 0xFF, 0x0dca & 0xFF}, + {0x0dcf & 0xFF, 0x0dd4 & 0xFF}, + {0x0dd6 & 0xFF, 0x0dd6 & 0xFF}, + {0x0dd8 & 0xFF, 0x0ddf & 0xFF}, + {0x0df2 & 0xFF, 0x0df3 & 0xFF}, + {0x0df4 & 0xFF, 0x0df4 & 0xFF}, + {0x0e01 & 0xFF, 0x0e30 & 0xFF}, + {0x0e31 & 0xFF, 0x0e31 & 0xFF}, + {0x0e32 & 0xFF, 0x0e33 & 0xFF}, + {0x0e34 & 0xFF, 0x0e3a & 0xFF}, + {0x0e3f & 0xFF, 0x0e3f & 0xFF}, + {0x0e40 & 0xFF, 0x0e46 & 0xFF}, + {0x0e47 & 0xFF, 0x0e4e & 0xFF}, + {0x0e4f & 0xFF, 0x0e4f & 0xFF}, + {0x0e50 & 0xFF, 0x0e59 & 0xFF}, + {0x0e5a & 0xFF, 0x0e5b & 0xFF}, + {0x0e81 & 0xFF, 0x0e82 & 0xFF}, + {0x0e84 & 0xFF, 0x0e84 & 0xFF}, + {0x0e87 & 0xFF, 0x0e88 & 0xFF}, + {0x0e8a & 0xFF, 0x0e8a & 0xFF}, + {0x0e8d & 0xFF, 0x0e8d & 0xFF}, + {0x0e94 & 0xFF, 0x0e97 & 0xFF}, + {0x0e99 & 0xFF, 0x0e9f & 0xFF}, + {0x0ea1 & 0xFF, 0x0ea3 & 0xFF}, + {0x0ea5 & 0xFF, 0x0ea5 & 0xFF}, + {0x0ea7 & 0xFF, 0x0ea7 & 0xFF}, + {0x0eaa & 0xFF, 0x0eab & 0xFF}, + {0x0ead & 0xFF, 0x0eb0 & 0xFF}, + {0x0eb1 & 0xFF, 0x0eb1 & 0xFF}, + {0x0eb2 & 0xFF, 0x0eb3 & 0xFF}, + {0x0eb4 & 0xFF, 0x0eb9 & 0xFF}, + {0x0ebb & 0xFF, 0x0ebc & 0xFF}, + {0x0ebd & 0xFF, 0x0ebd & 0xFF}, + {0x0ec0 & 0xFF, 0x0ec4 & 0xFF}, + {0x0ec6 & 0xFF, 0x0ec6 & 0xFF}, + {0x0ec8 & 0xFF, 0x0ecd & 0xFF}, + {0x0ed0 & 0xFF, 0x0ed9 & 0xFF}, + {0x0edc & 0xFF, 0x0edd & 0xFF}, + {0x0f00 & 0xFF, 0x0f00 & 0xFF}, + {0x0f01 & 0xFF, 0x0f04 & 0xFF}, + {0x0f05 & 0xFF, 0x0f05 & 0xFF}, + {0x0f06 & 0xFF, 0x0f07 & 0xFF}, + {0x0f08 & 0xFF, 0x0f08 & 0xFF}, + {0x0f09 & 0xFF, 0x0f0a & 0xFF}, + {0x0f0b & 0xFF, 0x0f0b & 0xFF}, + {0x0f0c & 0xFF, 0x0f0c & 0xFF}, + {0x0f0d & 0xFF, 0x0f11 & 0xFF}, + {0x0f12 & 0xFF, 0x0f12 & 0xFF}, + {0x0f13 & 0xFF, 0x0f13 & 0xFF}, + {0x0f14 & 0xFF, 0x0f14 & 0xFF}, + {0x0f15 & 0xFF, 0x0f17 & 0xFF}, + {0x0f18 & 0xFF, 0x0f19 & 0xFF}, + {0x0f1a & 0xFF, 0x0f1f & 0xFF}, + {0x0f20 & 0xFF, 0x0f29 & 0xFF}, + {0x0f2a & 0xFF, 0x0f33 & 0xFF}, + {0x0f34 & 0xFF, 0x0f34 & 0xFF}, + {0x0f35 & 0xFF, 0x0f35 & 0xFF}, + {0x0f36 & 0xFF, 0x0f36 & 0xFF}, + {0x0f37 & 0xFF, 0x0f37 & 0xFF}, + {0x0f38 & 0xFF, 0x0f38 & 0xFF}, + {0x0f39 & 0xFF, 0x0f39 & 0xFF}, + {0x0f3a & 0xFF, 0x0f3a & 0xFF}, + {0x0f3b & 0xFF, 0x0f3b & 0xFF}, + {0x0f3c & 0xFF, 0x0f3c & 0xFF}, + {0x0f3d & 0xFF, 0x0f3d & 0xFF}, + {0x0f3e & 0xFF, 0x0f3f & 0xFF}, + {0x0f40 & 0xFF, 0x0f47 & 0xFF}, + {0x0f49 & 0xFF, 0x0f6c & 0xFF}, + {0x0f71 & 0xFF, 0x0f7e & 0xFF}, + {0x0f7f & 0xFF, 0x0f7f & 0xFF}, + {0x0f80 & 0xFF, 0x0f84 & 0xFF}, + {0x0f85 & 0xFF, 0x0f85 & 0xFF}, + {0x0f86 & 0xFF, 0x0f87 & 0xFF}, + {0x0f88 & 0xFF, 0x0f8c & 0xFF}, + {0x0f8d & 0xFF, 0x0f97 & 0xFF}, + {0x0f99 & 0xFF, 0x0fbc & 0xFF}, + {0x0fbe & 0xFF, 0x0fbf & 0xFF}, + {0x0fc0 & 0xFF, 0x0fc5 & 0xFF}, + {0x0fc6 & 0xFF, 0x0fc6 & 0xFF}, + {0x0fc7 & 0xFF, 0x0fcc & 0xFF}, + {0x0fce & 0xFF, 0x0fcf & 0xFF}, + {0x0fd0 & 0xFF, 0x0fd1 & 0xFF}, + {0x0fd2 & 0xFF, 0x0fd2 & 0xFF}, + {0x0fd3 & 0xFF, 0x0fd3 & 0xFF}, + {0x0fd4 & 0xFF, 0x0fd8 & 0xFF}, + {0x0fd9 & 0xFF, 0x0fda & 0xFF}, + {0x1000 & 0xFF, 0x102a & 0xFF}, + {0x102b & 0xFF, 0x103e & 0xFF}, + {0x103f & 0xFF, 0x103f & 0xFF}, + {0x1040 & 0xFF, 0x1049 & 0xFF}, + {0x104a & 0xFF, 0x104b & 0xFF}, + {0x104c & 0xFF, 0x1055 & 0xFF}, + {0x1056 & 0xFF, 0x1059 & 0xFF}, + {0x105a & 0xFF, 0x105d & 0xFF}, + {0x105e & 0xFF, 0x1060 & 0xFF}, + {0x1061 & 0xFF, 0x1061 & 0xFF}, + {0x1062 & 0xFF, 0x1064 & 0xFF}, + {0x1065 & 0xFF, 0x1066 & 0xFF}, + {0x1067 & 0xFF, 0x106d & 0xFF}, + {0x106e & 0xFF, 0x1070 & 0xFF}, + {0x1071 & 0xFF, 0x1074 & 0xFF}, + {0x1075 & 0xFF, 0x1081 & 0xFF}, + {0x1082 & 0xFF, 0x108d & 0xFF}, + {0x108e & 0xFF, 0x108e & 0xFF}, + {0x108f & 0xFF, 0x108f & 0xFF}, + {0x1090 & 0xFF, 0x1099 & 0xFF}, + {0x109a & 0xFF, 0x109d & 0xFF}, + {0x109e & 0xFF, 0x10c5 & 0xFF}, + {0x10d0 & 0xFF, 0x10fc & 0xFF}, + {0x1100 & 0xFF, 0x115f & 0xFF}, + {0x1160 & 0xFF, 0x11a7 & 0xFF}, + {0x11a8 & 0xFF, 0x11ff & 0xFF}, + {0x1200 & 0xFF, 0x1248 & 0xFF}, + {0x124a & 0xFF, 0x124d & 0xFF}, + {0x1250 & 0xFF, 0x1256 & 0xFF}, + {0x1258 & 0xFF, 0x1258 & 0xFF}, + {0x125a & 0xFF, 0x125d & 0xFF}, + {0x1260 & 0xFF, 0x1288 & 0xFF}, + {0x128a & 0xFF, 0x128d & 0xFF}, + {0x1290 & 0xFF, 0x12b0 & 0xFF}, + {0x12b2 & 0xFF, 0x12b5 & 0xFF}, + {0x12b8 & 0xFF, 0x12be & 0xFF}, + {0x12c0 & 0xFF, 0x12c0 & 0xFF}, + {0x12c2 & 0xFF, 0x12c5 & 0xFF}, + {0x12c8 & 0xFF, 0x12d6 & 0xFF}, + {0x12d8 & 0xFF, 0x12ff & 0xFF}, + {0x1300 & 0xFF, 0x1310 & 0xFF}, + {0x1312 & 0xFF, 0x1315 & 0xFF}, + {0x1318 & 0xFF, 0x135a & 0xFF}, + {0x135d & 0xFF, 0x135f & 0xFF}, + {0x1360 & 0xFF, 0x1360 & 0xFF}, + {0x1361 & 0xFF, 0x1361 & 0xFF}, + {0x1362 & 0xFF, 0x137c & 0xFF}, + {0x1380 & 0xFF, 0x1399 & 0xFF}, + {0x13a0 & 0xFF, 0x13f4 & 0xFF}, + {0x1400 & 0xFF, 0x1400 & 0xFF}, + {0x1401 & 0xFF, 0x14ff & 0xFF}, + {0x1500 & 0xFF, 0x15ff & 0xFF}, + {0x1600 & 0xFF, 0x167f & 0xFF}, + {0x1680 & 0xFF, 0x1680 & 0xFF}, + {0x1681 & 0xFF, 0x169a & 0xFF}, + {0x169b & 0xFF, 0x169b & 0xFF}, + {0x169c & 0xFF, 0x169c & 0xFF}, + {0x16a0 & 0xFF, 0x16ea & 0xFF}, + {0x16eb & 0xFF, 0x16ed & 0xFF}, + {0x16ee & 0xFF, 0x16f0 & 0xFF}, + {0x1700 & 0xFF, 0x170c & 0xFF}, + {0x170e & 0xFF, 0x1711 & 0xFF}, + {0x1712 & 0xFF, 0x1714 & 0xFF}, + {0x1720 & 0xFF, 0x1731 & 0xFF}, + {0x1732 & 0xFF, 0x1734 & 0xFF}, + {0x1735 & 0xFF, 0x1736 & 0xFF}, + {0x1740 & 0xFF, 0x1751 & 0xFF}, + {0x1752 & 0xFF, 0x1753 & 0xFF}, + {0x1760 & 0xFF, 0x176c & 0xFF}, + {0x176e & 0xFF, 0x1770 & 0xFF}, + {0x1772 & 0xFF, 0x1773 & 0xFF}, + {0x1780 & 0xFF, 0x17b5 & 0xFF}, + {0x17b6 & 0xFF, 0x17d3 & 0xFF}, + {0x17d4 & 0xFF, 0x17d5 & 0xFF}, + {0x17d6 & 0xFF, 0x17d6 & 0xFF}, + {0x17d7 & 0xFF, 0x17d7 & 0xFF}, + {0x17d8 & 0xFF, 0x17d8 & 0xFF}, + {0x17d9 & 0xFF, 0x17d9 & 0xFF}, + {0x17da & 0xFF, 0x17da & 0xFF}, + {0x17db & 0xFF, 0x17db & 0xFF}, + {0x17dc & 0xFF, 0x17dc & 0xFF}, + {0x17dd & 0xFF, 0x17dd & 0xFF}, + {0x17e0 & 0xFF, 0x17e9 & 0xFF}, + {0x17f0 & 0xFF, 0x17f9 & 0xFF}, + {0x1800 & 0xFF, 0x1801 & 0xFF}, + {0x1802 & 0xFF, 0x1803 & 0xFF}, + {0x1804 & 0xFF, 0x1805 & 0xFF}, + {0x1806 & 0xFF, 0x1806 & 0xFF}, + {0x1807 & 0xFF, 0x1807 & 0xFF}, + {0x1808 & 0xFF, 0x1809 & 0xFF}, + {0x180a & 0xFF, 0x180a & 0xFF}, + {0x180b & 0xFF, 0x180d & 0xFF}, + {0x180e & 0xFF, 0x180e & 0xFF}, + {0x1810 & 0xFF, 0x1819 & 0xFF}, + {0x1820 & 0xFF, 0x1877 & 0xFF}, + {0x1880 & 0xFF, 0x18a8 & 0xFF}, + {0x18a9 & 0xFF, 0x18a9 & 0xFF}, + {0x18aa & 0xFF, 0x18aa & 0xFF}, + {0x18b0 & 0xFF, 0x18f5 & 0xFF}, + {0x1900 & 0xFF, 0x191c & 0xFF}, + {0x1920 & 0xFF, 0x192b & 0xFF}, + {0x1930 & 0xFF, 0x193b & 0xFF}, + {0x1940 & 0xFF, 0x1940 & 0xFF}, + {0x1944 & 0xFF, 0x1945 & 0xFF}, + {0x1946 & 0xFF, 0x194f & 0xFF}, + {0x1950 & 0xFF, 0x196d & 0xFF}, + {0x1970 & 0xFF, 0x1974 & 0xFF}, + {0x1980 & 0xFF, 0x19ab & 0xFF}, + {0x19b0 & 0xFF, 0x19c0 & 0xFF}, + {0x19c1 & 0xFF, 0x19c7 & 0xFF}, + {0x19c8 & 0xFF, 0x19c9 & 0xFF}, + {0x19d0 & 0xFF, 0x19d9 & 0xFF}, + {0x19da & 0xFF, 0x19da & 0xFF}, + {0x19de & 0xFF, 0x19ff & 0xFF}, + {0x1a00 & 0xFF, 0x1a16 & 0xFF}, + {0x1a17 & 0xFF, 0x1a1b & 0xFF}, + {0x1a1e & 0xFF, 0x1a54 & 0xFF}, + {0x1a55 & 0xFF, 0x1a5e & 0xFF}, + {0x1a60 & 0xFF, 0x1a7c & 0xFF}, + {0x1a7f & 0xFF, 0x1a7f & 0xFF}, + {0x1a80 & 0xFF, 0x1a89 & 0xFF}, + {0x1a90 & 0xFF, 0x1a99 & 0xFF}, + {0x1aa0 & 0xFF, 0x1aad & 0xFF}, + {0x1b00 & 0xFF, 0x1b04 & 0xFF}, + {0x1b05 & 0xFF, 0x1b33 & 0xFF}, + {0x1b34 & 0xFF, 0x1b44 & 0xFF}, + {0x1b45 & 0xFF, 0x1b4b & 0xFF}, + {0x1b50 & 0xFF, 0x1b59 & 0xFF}, + {0x1b5a & 0xFF, 0x1b5b & 0xFF}, + {0x1b5c & 0xFF, 0x1b5c & 0xFF}, + {0x1b5d & 0xFF, 0x1b60 & 0xFF}, + {0x1b61 & 0xFF, 0x1b6a & 0xFF}, + {0x1b6b & 0xFF, 0x1b73 & 0xFF}, + {0x1b74 & 0xFF, 0x1b7c & 0xFF}, + {0x1b80 & 0xFF, 0x1b82 & 0xFF}, + {0x1b83 & 0xFF, 0x1ba0 & 0xFF}, + {0x1ba1 & 0xFF, 0x1baa & 0xFF}, + {0x1bae & 0xFF, 0x1baf & 0xFF}, + {0x1bb0 & 0xFF, 0x1bb9 & 0xFF}, + {0x1bc0 & 0xFF, 0x1be5 & 0xFF}, + {0x1be6 & 0xFF, 0x1bf3 & 0xFF}, + {0x1bfc & 0xFF, 0x1bff & 0xFF}, + {0x1c00 & 0xFF, 0x1c23 & 0xFF}, + {0x1c24 & 0xFF, 0x1c37 & 0xFF}, + {0x1c3b & 0xFF, 0x1c3f & 0xFF}, + {0x1c40 & 0xFF, 0x1c49 & 0xFF}, + {0x1c4d & 0xFF, 0x1c4f & 0xFF}, + {0x1c50 & 0xFF, 0x1c59 & 0xFF}, + {0x1c5a & 0xFF, 0x1c7d & 0xFF}, + {0x1c7e & 0xFF, 0x1c7f & 0xFF}, + {0x1cd0 & 0xFF, 0x1cd2 & 0xFF}, + {0x1cd3 & 0xFF, 0x1cd3 & 0xFF}, + {0x1cd4 & 0xFF, 0x1ce8 & 0xFF}, + {0x1ce9 & 0xFF, 0x1cec & 0xFF}, + {0x1ced & 0xFF, 0x1ced & 0xFF}, + {0x1cee & 0xFF, 0x1cf1 & 0xFF}, + {0x1cf2 & 0xFF, 0x1cf2 & 0xFF}, + {0x1d00 & 0xFF, 0x1dbf & 0xFF}, + {0x1dc0 & 0xFF, 0x1de6 & 0xFF}, + {0x1dfc & 0xFF, 0x1dff & 0xFF}, + {0x1e00 & 0xFF, 0x1eff & 0xFF}, + {0x1f00 & 0xFF, 0x1f15 & 0xFF}, + {0x1f18 & 0xFF, 0x1f1d & 0xFF}, + {0x1f20 & 0xFF, 0x1f45 & 0xFF}, + {0x1f48 & 0xFF, 0x1f4d & 0xFF}, + {0x1f50 & 0xFF, 0x1f57 & 0xFF}, + {0x1f59 & 0xFF, 0x1f59 & 0xFF}, + {0x1f5b & 0xFF, 0x1f5b & 0xFF}, + {0x1f5d & 0xFF, 0x1f5d & 0xFF}, + {0x1f5f & 0xFF, 0x1f7d & 0xFF}, + {0x1f80 & 0xFF, 0x1fb4 & 0xFF}, + {0x1fb6 & 0xFF, 0x1fc4 & 0xFF}, + {0x1fc6 & 0xFF, 0x1fd3 & 0xFF}, + {0x1fd6 & 0xFF, 0x1fdb & 0xFF}, + {0x1fdd & 0xFF, 0x1fef & 0xFF}, + {0x1ff2 & 0xFF, 0x1ff4 & 0xFF}, + {0x1ff6 & 0xFF, 0x1ffc & 0xFF}, + {0x1ffd & 0xFF, 0x1ffd & 0xFF}, + {0x1ffe & 0xFF, 0x1ffe & 0xFF}, + {0x2000 & 0xFF, 0x2006 & 0xFF}, + {0x2007 & 0xFF, 0x2007 & 0xFF}, + {0x2008 & 0xFF, 0x200a & 0xFF}, + {0x200b & 0xFF, 0x200b & 0xFF}, + {0x200c & 0xFF, 0x200f & 0xFF}, + {0x2010 & 0xFF, 0x2010 & 0xFF}, + {0x2011 & 0xFF, 0x2011 & 0xFF}, + {0x2012 & 0xFF, 0x2013 & 0xFF}, + {0x2014 & 0xFF, 0x2014 & 0xFF}, + {0x2015 & 0xFF, 0x2017 & 0xFF}, + {0x2018 & 0xFF, 0x2019 & 0xFF}, + {0x201a & 0xFF, 0x201a & 0xFF}, + {0x201b & 0xFF, 0x201d & 0xFF}, + {0x201e & 0xFF, 0x201e & 0xFF}, + {0x201f & 0xFF, 0x201f & 0xFF}, + {0x2020 & 0xFF, 0x2023 & 0xFF}, + {0x2024 & 0xFF, 0x2026 & 0xFF}, + {0x2027 & 0xFF, 0x2027 & 0xFF}, + {0x2028 & 0xFF, 0x2029 & 0xFF}, + {0x202a & 0xFF, 0x202e & 0xFF}, + {0x202f & 0xFF, 0x202f & 0xFF}, + {0x2030 & 0xFF, 0x2037 & 0xFF}, + {0x2038 & 0xFF, 0x2038 & 0xFF}, + {0x2039 & 0xFF, 0x203a & 0xFF}, + {0x203b & 0xFF, 0x203b & 0xFF}, + {0x203c & 0xFF, 0x203d & 0xFF}, + {0x203e & 0xFF, 0x2043 & 0xFF}, + {0x2044 & 0xFF, 0x2044 & 0xFF}, + {0x2045 & 0xFF, 0x2045 & 0xFF}, + {0x2046 & 0xFF, 0x2046 & 0xFF}, + {0x2047 & 0xFF, 0x2049 & 0xFF}, + {0x204a & 0xFF, 0x2055 & 0xFF}, + {0x2056 & 0xFF, 0x2056 & 0xFF}, + {0x2057 & 0xFF, 0x2057 & 0xFF}, + {0x2058 & 0xFF, 0x205b & 0xFF}, + {0x205c & 0xFF, 0x205c & 0xFF}, + {0x205d & 0xFF, 0x205f & 0xFF}, + {0x2060 & 0xFF, 0x2060 & 0xFF}, + {0x2061 & 0xFF, 0x2064 & 0xFF}, + {0x206a & 0xFF, 0x206f & 0xFF}, + {0x2070 & 0xFF, 0x2071 & 0xFF}, + {0x2074 & 0xFF, 0x207c & 0xFF}, + {0x207d & 0xFF, 0x207d & 0xFF}, + {0x207e & 0xFF, 0x207e & 0xFF}, + {0x207f & 0xFF, 0x208c & 0xFF}, + {0x208d & 0xFF, 0x208d & 0xFF}, + {0x208e & 0xFF, 0x208e & 0xFF}, + {0x2090 & 0xFF, 0x209c & 0xFF}, + {0x20a0 & 0xFF, 0x20a6 & 0xFF}, + {0x20a7 & 0xFF, 0x20a7 & 0xFF}, + {0x20a8 & 0xFF, 0x20b5 & 0xFF}, + {0x20b6 & 0xFF, 0x20b6 & 0xFF}, + {0x20b7 & 0xFF, 0x20b9 & 0xFF}, + {0x20d0 & 0xFF, 0x20f0 & 0xFF}, + {0x2100 & 0xFF, 0x2102 & 0xFF}, + {0x2103 & 0xFF, 0x2103 & 0xFF}, + {0x2104 & 0xFF, 0x2108 & 0xFF}, + {0x2109 & 0xFF, 0x2109 & 0xFF}, + {0x210a & 0xFF, 0x2115 & 0xFF}, + {0x2116 & 0xFF, 0x2116 & 0xFF}, + {0x2117 & 0xFF, 0x2189 & 0xFF}, + {0x2190 & 0xFF, 0x21ff & 0xFF}, + {0x2200 & 0xFF, 0x2211 & 0xFF}, + {0x2212 & 0xFF, 0x2213 & 0xFF}, + {0x2214 & 0xFF, 0x22ff & 0xFF}, + {0x2300 & 0xFF, 0x2328 & 0xFF}, + {0x2329 & 0xFF, 0x2329 & 0xFF}, + {0x232a & 0xFF, 0x232a & 0xFF}, + {0x232b & 0xFF, 0x23f3 & 0xFF}, + {0x2400 & 0xFF, 0x2426 & 0xFF}, + {0x2440 & 0xFF, 0x244a & 0xFF}, + {0x2460 & 0xFF, 0x24ff & 0xFF}, + {0x2500 & 0xFF, 0x25ff & 0xFF}, + {0x2600 & 0xFF, 0x26ff & 0xFF}, + {0x2701 & 0xFF, 0x275a & 0xFF}, + {0x275b & 0xFF, 0x275e & 0xFF}, + {0x275f & 0xFF, 0x2761 & 0xFF}, + {0x2762 & 0xFF, 0x2763 & 0xFF}, + {0x2764 & 0xFF, 0x2767 & 0xFF}, + {0x2768 & 0xFF, 0x2768 & 0xFF}, + {0x2769 & 0xFF, 0x2769 & 0xFF}, + {0x276a & 0xFF, 0x276a & 0xFF}, + {0x276b & 0xFF, 0x276b & 0xFF}, + {0x276c & 0xFF, 0x276c & 0xFF}, + {0x276d & 0xFF, 0x276d & 0xFF}, + {0x276e & 0xFF, 0x276e & 0xFF}, + {0x276f & 0xFF, 0x276f & 0xFF}, + {0x2770 & 0xFF, 0x2770 & 0xFF}, + {0x2771 & 0xFF, 0x2771 & 0xFF}, + {0x2772 & 0xFF, 0x2772 & 0xFF}, + {0x2773 & 0xFF, 0x2773 & 0xFF}, + {0x2774 & 0xFF, 0x2774 & 0xFF}, + {0x2775 & 0xFF, 0x2775 & 0xFF}, + {0x2776 & 0xFF, 0x27c4 & 0xFF}, + {0x27c5 & 0xFF, 0x27c5 & 0xFF}, + {0x27c6 & 0xFF, 0x27c6 & 0xFF}, + {0x27c7 & 0xFF, 0x27ca & 0xFF}, + {0x27cc & 0xFF, 0x27cc & 0xFF}, + {0x27ce & 0xFF, 0x27e5 & 0xFF}, + {0x27e6 & 0xFF, 0x27e6 & 0xFF}, + {0x27e7 & 0xFF, 0x27e7 & 0xFF}, + {0x27e8 & 0xFF, 0x27e8 & 0xFF}, + {0x27e9 & 0xFF, 0x27e9 & 0xFF}, + {0x27ea & 0xFF, 0x27ea & 0xFF}, + {0x27eb & 0xFF, 0x27eb & 0xFF}, + {0x27ec & 0xFF, 0x27ec & 0xFF}, + {0x27ed & 0xFF, 0x27ed & 0xFF}, + {0x27ee & 0xFF, 0x27ee & 0xFF}, + {0x27ef & 0xFF, 0x27ef & 0xFF}, + {0x27f0 & 0xFF, 0x27ff & 0xFF}, + {0x2800 & 0xFF, 0x28ff & 0xFF}, + {0x2900 & 0xFF, 0x2982 & 0xFF}, + {0x2983 & 0xFF, 0x2983 & 0xFF}, + {0x2984 & 0xFF, 0x2984 & 0xFF}, + {0x2985 & 0xFF, 0x2985 & 0xFF}, + {0x2986 & 0xFF, 0x2986 & 0xFF}, + {0x2987 & 0xFF, 0x2987 & 0xFF}, + {0x2988 & 0xFF, 0x2988 & 0xFF}, + {0x2989 & 0xFF, 0x2989 & 0xFF}, + {0x298a & 0xFF, 0x298a & 0xFF}, + {0x298b & 0xFF, 0x298b & 0xFF}, + {0x298c & 0xFF, 0x298c & 0xFF}, + {0x298d & 0xFF, 0x298d & 0xFF}, + {0x298e & 0xFF, 0x298e & 0xFF}, + {0x298f & 0xFF, 0x298f & 0xFF}, + {0x2990 & 0xFF, 0x2990 & 0xFF}, + {0x2991 & 0xFF, 0x2991 & 0xFF}, + {0x2992 & 0xFF, 0x2992 & 0xFF}, + {0x2993 & 0xFF, 0x2993 & 0xFF}, + {0x2994 & 0xFF, 0x2994 & 0xFF}, + {0x2995 & 0xFF, 0x2995 & 0xFF}, + {0x2996 & 0xFF, 0x2996 & 0xFF}, + {0x2997 & 0xFF, 0x2997 & 0xFF}, + {0x2998 & 0xFF, 0x2998 & 0xFF}, + {0x2999 & 0xFF, 0x29d7 & 0xFF}, + {0x29d8 & 0xFF, 0x29d8 & 0xFF}, + {0x29d9 & 0xFF, 0x29d9 & 0xFF}, + {0x29da & 0xFF, 0x29da & 0xFF}, + {0x29db & 0xFF, 0x29db & 0xFF}, + {0x29dc & 0xFF, 0x29fb & 0xFF}, + {0x29fc & 0xFF, 0x29fc & 0xFF}, + {0x29fd & 0xFF, 0x29fd & 0xFF}, + {0x29fe & 0xFF, 0x29ff & 0xFF}, + {0x2a00 & 0xFF, 0x2aff & 0xFF}, + {0x2b00 & 0xFF, 0x2b4c & 0xFF}, + {0x2b50 & 0xFF, 0x2b59 & 0xFF}, + {0x2c00 & 0xFF, 0x2c2e & 0xFF}, + {0x2c30 & 0xFF, 0x2c5e & 0xFF}, + {0x2c60 & 0xFF, 0x2cee & 0xFF}, + {0x2cef & 0xFF, 0x2cf1 & 0xFF}, + {0x2cf9 & 0xFF, 0x2cf9 & 0xFF}, + {0x2cfa & 0xFF, 0x2cfc & 0xFF}, + {0x2cfd & 0xFF, 0x2cfd & 0xFF}, + {0x2cfe & 0xFF, 0x2cfe & 0xFF}, + {0x2cff & 0xFF, 0x2cff & 0xFF}, + {0x2d00 & 0xFF, 0x2d25 & 0xFF}, + {0x2d30 & 0xFF, 0x2d65 & 0xFF}, + {0x2d6f & 0xFF, 0x2d6f & 0xFF}, + {0x2d70 & 0xFF, 0x2d70 & 0xFF}, + {0x2d7f & 0xFF, 0x2d7f & 0xFF}, + {0x2d80 & 0xFF, 0x2d96 & 0xFF}, + {0x2da0 & 0xFF, 0x2da6 & 0xFF}, + {0x2da8 & 0xFF, 0x2dae & 0xFF}, + {0x2db0 & 0xFF, 0x2db6 & 0xFF}, + {0x2db8 & 0xFF, 0x2dbe & 0xFF}, + {0x2dc0 & 0xFF, 0x2dc6 & 0xFF}, + {0x2dc8 & 0xFF, 0x2dce & 0xFF}, + {0x2dd0 & 0xFF, 0x2dd6 & 0xFF}, + {0x2dd8 & 0xFF, 0x2dde & 0xFF}, + {0x2de0 & 0xFF, 0x2dff & 0xFF}, + {0x2e00 & 0xFF, 0x2e0d & 0xFF}, + {0x2e0e & 0xFF, 0x2e15 & 0xFF}, + {0x2e16 & 0xFF, 0x2e16 & 0xFF}, + {0x2e17 & 0xFF, 0x2e17 & 0xFF}, + {0x2e18 & 0xFF, 0x2e18 & 0xFF}, + {0x2e19 & 0xFF, 0x2e19 & 0xFF}, + {0x2e1a & 0xFF, 0x2e1b & 0xFF}, + {0x2e1c & 0xFF, 0x2e1d & 0xFF}, + {0x2e1e & 0xFF, 0x2e1f & 0xFF}, + {0x2e20 & 0xFF, 0x2e21 & 0xFF}, + {0x2e22 & 0xFF, 0x2e22 & 0xFF}, + {0x2e23 & 0xFF, 0x2e23 & 0xFF}, + {0x2e24 & 0xFF, 0x2e24 & 0xFF}, + {0x2e25 & 0xFF, 0x2e25 & 0xFF}, + {0x2e26 & 0xFF, 0x2e26 & 0xFF}, + {0x2e27 & 0xFF, 0x2e27 & 0xFF}, + {0x2e28 & 0xFF, 0x2e28 & 0xFF}, + {0x2e29 & 0xFF, 0x2e29 & 0xFF}, + {0x2e2a & 0xFF, 0x2e2d & 0xFF}, + {0x2e2e & 0xFF, 0x2e2e & 0xFF}, + {0x2e2f & 0xFF, 0x2e2f & 0xFF}, + {0x2e30 & 0xFF, 0x2e31 & 0xFF}, + {0x2e80 & 0xFF, 0x2e99 & 0xFF}, + {0x2e9b & 0xFF, 0x2ef3 & 0xFF}, + {0x2f00 & 0xFF, 0x2fd5 & 0xFF}, + {0x2ff0 & 0xFF, 0x2ffb & 0xFF}, + {0x3000 & 0xFF, 0x3000 & 0xFF}, + {0x3001 & 0xFF, 0x3002 & 0xFF}, + {0x3003 & 0xFF, 0x3004 & 0xFF}, + {0x3005 & 0xFF, 0x3005 & 0xFF}, + {0x3006 & 0xFF, 0x3007 & 0xFF}, + {0x3008 & 0xFF, 0x3008 & 0xFF}, + {0x3009 & 0xFF, 0x3009 & 0xFF}, + {0x300a & 0xFF, 0x300a & 0xFF}, + {0x300b & 0xFF, 0x300b & 0xFF}, + {0x300c & 0xFF, 0x300c & 0xFF}, + {0x300d & 0xFF, 0x300d & 0xFF}, + {0x300e & 0xFF, 0x300e & 0xFF}, + {0x300f & 0xFF, 0x300f & 0xFF}, + {0x3010 & 0xFF, 0x3010 & 0xFF}, + {0x3011 & 0xFF, 0x3011 & 0xFF}, + {0x3012 & 0xFF, 0x3013 & 0xFF}, + {0x3014 & 0xFF, 0x3014 & 0xFF}, + {0x3015 & 0xFF, 0x3015 & 0xFF}, + {0x3016 & 0xFF, 0x3016 & 0xFF}, + {0x3017 & 0xFF, 0x3017 & 0xFF}, + {0x3018 & 0xFF, 0x3018 & 0xFF}, + {0x3019 & 0xFF, 0x3019 & 0xFF}, + {0x301a & 0xFF, 0x301a & 0xFF}, + {0x301b & 0xFF, 0x301b & 0xFF}, + {0x301c & 0xFF, 0x301c & 0xFF}, + {0x301d & 0xFF, 0x301d & 0xFF}, + {0x301e & 0xFF, 0x301f & 0xFF}, + {0x3020 & 0xFF, 0x3029 & 0xFF}, + {0x302a & 0xFF, 0x302f & 0xFF}, + {0x3030 & 0xFF, 0x303a & 0xFF}, + {0x303b & 0xFF, 0x303c & 0xFF}, + {0x303d & 0xFF, 0x303f & 0xFF}, + {0x3041 & 0xFF, 0x3041 & 0xFF}, + {0x3042 & 0xFF, 0x3042 & 0xFF}, + {0x3043 & 0xFF, 0x3043 & 0xFF}, + {0x3044 & 0xFF, 0x3044 & 0xFF}, + {0x3045 & 0xFF, 0x3045 & 0xFF}, + {0x3046 & 0xFF, 0x3046 & 0xFF}, + {0x3047 & 0xFF, 0x3047 & 0xFF}, + {0x3048 & 0xFF, 0x3048 & 0xFF}, + {0x3049 & 0xFF, 0x3049 & 0xFF}, + {0x304a & 0xFF, 0x3062 & 0xFF}, + {0x3063 & 0xFF, 0x3063 & 0xFF}, + {0x3064 & 0xFF, 0x3082 & 0xFF}, + {0x3083 & 0xFF, 0x3083 & 0xFF}, + {0x3084 & 0xFF, 0x3084 & 0xFF}, + {0x3085 & 0xFF, 0x3085 & 0xFF}, + {0x3086 & 0xFF, 0x3086 & 0xFF}, + {0x3087 & 0xFF, 0x3087 & 0xFF}, + {0x3088 & 0xFF, 0x308d & 0xFF}, + {0x308e & 0xFF, 0x308e & 0xFF}, + {0x308f & 0xFF, 0x3094 & 0xFF}, + {0x3095 & 0xFF, 0x3096 & 0xFF}, + {0x3099 & 0xFF, 0x309a & 0xFF}, + {0x309b & 0xFF, 0x309e & 0xFF}, + {0x309f & 0xFF, 0x309f & 0xFF}, + {0x30a0 & 0xFF, 0x30a1 & 0xFF}, + {0x30a2 & 0xFF, 0x30a2 & 0xFF}, + {0x30a3 & 0xFF, 0x30a3 & 0xFF}, + {0x30a4 & 0xFF, 0x30a4 & 0xFF}, + {0x30a5 & 0xFF, 0x30a5 & 0xFF}, + {0x30a6 & 0xFF, 0x30a6 & 0xFF}, + {0x30a7 & 0xFF, 0x30a7 & 0xFF}, + {0x30a8 & 0xFF, 0x30a8 & 0xFF}, + {0x30a9 & 0xFF, 0x30a9 & 0xFF}, + {0x30aa & 0xFF, 0x30c2 & 0xFF}, + {0x30c3 & 0xFF, 0x30c3 & 0xFF}, + {0x30c4 & 0xFF, 0x30e2 & 0xFF}, + {0x30e3 & 0xFF, 0x30e3 & 0xFF}, + {0x30e4 & 0xFF, 0x30e4 & 0xFF}, + {0x30e5 & 0xFF, 0x30e5 & 0xFF}, + {0x30e6 & 0xFF, 0x30e6 & 0xFF}, + {0x30e7 & 0xFF, 0x30e7 & 0xFF}, + {0x30e8 & 0xFF, 0x30ed & 0xFF}, + {0x30ee & 0xFF, 0x30ee & 0xFF}, + {0x30ef & 0xFF, 0x30f4 & 0xFF}, + {0x30f5 & 0xFF, 0x30f6 & 0xFF}, + {0x30f7 & 0xFF, 0x30fa & 0xFF}, + {0x30fb & 0xFF, 0x30fe & 0xFF}, + {0x30ff & 0xFF, 0x30ff & 0xFF}, + {0x3105 & 0xFF, 0x312d & 0xFF}, + {0x3131 & 0xFF, 0x318e & 0xFF}, + {0x3190 & 0xFF, 0x31ba & 0xFF}, + {0x31c0 & 0xFF, 0x31e3 & 0xFF}, + {0x31f0 & 0xFF, 0x31ff & 0xFF}, + {0x3200 & 0xFF, 0x321e & 0xFF}, + {0x3220 & 0xFF, 0x3247 & 0xFF}, + {0x3248 & 0xFF, 0x324f & 0xFF}, + {0x3250 & 0xFF, 0x32fe & 0xFF}, + {0x3300 & 0xFF, 0x33ff & 0xFF}, + {0x3400 & 0xFF, 0x34ff & 0xFF}, + {0x3500 & 0xFF, 0x35ff & 0xFF}, + {0x3600 & 0xFF, 0x36ff & 0xFF}, + {0x3700 & 0xFF, 0x37ff & 0xFF}, + {0x3800 & 0xFF, 0x38ff & 0xFF}, + {0x3900 & 0xFF, 0x39ff & 0xFF}, + {0x3a00 & 0xFF, 0x3aff & 0xFF}, + {0x3b00 & 0xFF, 0x3bff & 0xFF}, + {0x3c00 & 0xFF, 0x3cff & 0xFF}, + {0x3d00 & 0xFF, 0x3dff & 0xFF}, + {0x3e00 & 0xFF, 0x3eff & 0xFF}, + {0x3f00 & 0xFF, 0x3fff & 0xFF}, + {0x4000 & 0xFF, 0x40ff & 0xFF}, + {0x4100 & 0xFF, 0x41ff & 0xFF}, + {0x4200 & 0xFF, 0x42ff & 0xFF}, + {0x4300 & 0xFF, 0x43ff & 0xFF}, + {0x4400 & 0xFF, 0x44ff & 0xFF}, + {0x4500 & 0xFF, 0x45ff & 0xFF}, + {0x4600 & 0xFF, 0x46ff & 0xFF}, + {0x4700 & 0xFF, 0x47ff & 0xFF}, + {0x4800 & 0xFF, 0x48ff & 0xFF}, + {0x4900 & 0xFF, 0x49ff & 0xFF}, + {0x4a00 & 0xFF, 0x4aff & 0xFF}, + {0x4b00 & 0xFF, 0x4bff & 0xFF}, + {0x4c00 & 0xFF, 0x4cff & 0xFF}, + {0x4d00 & 0xFF, 0x4dbf & 0xFF}, + {0x4dc0 & 0xFF, 0x4dff & 0xFF}, + {0x4e00 & 0xFF, 0x4eff & 0xFF}, + {0x4f00 & 0xFF, 0x4fff & 0xFF}, + {0x5000 & 0xFF, 0x50ff & 0xFF}, + {0x5100 & 0xFF, 0x51ff & 0xFF}, + {0x5200 & 0xFF, 0x52ff & 0xFF}, + {0x5300 & 0xFF, 0x53ff & 0xFF}, + {0x5400 & 0xFF, 0x54ff & 0xFF}, + {0x5500 & 0xFF, 0x55ff & 0xFF}, + {0x5600 & 0xFF, 0x56ff & 0xFF}, + {0x5700 & 0xFF, 0x57ff & 0xFF}, + {0x5800 & 0xFF, 0x58ff & 0xFF}, + {0x5900 & 0xFF, 0x59ff & 0xFF}, + {0x5a00 & 0xFF, 0x5aff & 0xFF}, + {0x5b00 & 0xFF, 0x5bff & 0xFF}, + {0x5c00 & 0xFF, 0x5cff & 0xFF}, + {0x5d00 & 0xFF, 0x5dff & 0xFF}, + {0x5e00 & 0xFF, 0x5eff & 0xFF}, + {0x5f00 & 0xFF, 0x5fff & 0xFF}, + {0x6000 & 0xFF, 0x60ff & 0xFF}, + {0x6100 & 0xFF, 0x61ff & 0xFF}, + {0x6200 & 0xFF, 0x62ff & 0xFF}, + {0x6300 & 0xFF, 0x63ff & 0xFF}, + {0x6400 & 0xFF, 0x64ff & 0xFF}, + {0x6500 & 0xFF, 0x65ff & 0xFF}, + {0x6600 & 0xFF, 0x66ff & 0xFF}, + {0x6700 & 0xFF, 0x67ff & 0xFF}, + {0x6800 & 0xFF, 0x68ff & 0xFF}, + {0x6900 & 0xFF, 0x69ff & 0xFF}, + {0x6a00 & 0xFF, 0x6aff & 0xFF}, + {0x6b00 & 0xFF, 0x6bff & 0xFF}, + {0x6c00 & 0xFF, 0x6cff & 0xFF}, + {0x6d00 & 0xFF, 0x6dff & 0xFF}, + {0x6e00 & 0xFF, 0x6eff & 0xFF}, + {0x6f00 & 0xFF, 0x6fff & 0xFF}, + {0x7000 & 0xFF, 0x70ff & 0xFF}, + {0x7100 & 0xFF, 0x71ff & 0xFF}, + {0x7200 & 0xFF, 0x72ff & 0xFF}, + {0x7300 & 0xFF, 0x73ff & 0xFF}, + {0x7400 & 0xFF, 0x74ff & 0xFF}, + {0x7500 & 0xFF, 0x75ff & 0xFF}, + {0x7600 & 0xFF, 0x76ff & 0xFF}, + {0x7700 & 0xFF, 0x77ff & 0xFF}, + {0x7800 & 0xFF, 0x78ff & 0xFF}, + {0x7900 & 0xFF, 0x79ff & 0xFF}, + {0x7a00 & 0xFF, 0x7aff & 0xFF}, + {0x7b00 & 0xFF, 0x7bff & 0xFF}, + {0x7c00 & 0xFF, 0x7cff & 0xFF}, + {0x7d00 & 0xFF, 0x7dff & 0xFF}, + {0x7e00 & 0xFF, 0x7eff & 0xFF}, + {0x7f00 & 0xFF, 0x7fff & 0xFF}, + {0x8000 & 0xFF, 0x80ff & 0xFF}, + {0x8100 & 0xFF, 0x81ff & 0xFF}, + {0x8200 & 0xFF, 0x82ff & 0xFF}, + {0x8300 & 0xFF, 0x83ff & 0xFF}, + {0x8400 & 0xFF, 0x84ff & 0xFF}, + {0x8500 & 0xFF, 0x85ff & 0xFF}, + {0x8600 & 0xFF, 0x86ff & 0xFF}, + {0x8700 & 0xFF, 0x87ff & 0xFF}, + {0x8800 & 0xFF, 0x88ff & 0xFF}, + {0x8900 & 0xFF, 0x89ff & 0xFF}, + {0x8a00 & 0xFF, 0x8aff & 0xFF}, + {0x8b00 & 0xFF, 0x8bff & 0xFF}, + {0x8c00 & 0xFF, 0x8cff & 0xFF}, + {0x8d00 & 0xFF, 0x8dff & 0xFF}, + {0x8e00 & 0xFF, 0x8eff & 0xFF}, + {0x8f00 & 0xFF, 0x8fff & 0xFF}, + {0x9000 & 0xFF, 0x90ff & 0xFF}, + {0x9100 & 0xFF, 0x91ff & 0xFF}, + {0x9200 & 0xFF, 0x92ff & 0xFF}, + {0x9300 & 0xFF, 0x93ff & 0xFF}, + {0x9400 & 0xFF, 0x94ff & 0xFF}, + {0x9500 & 0xFF, 0x95ff & 0xFF}, + {0x9600 & 0xFF, 0x96ff & 0xFF}, + {0x9700 & 0xFF, 0x97ff & 0xFF}, + {0x9800 & 0xFF, 0x98ff & 0xFF}, + {0x9900 & 0xFF, 0x99ff & 0xFF}, + {0x9a00 & 0xFF, 0x9aff & 0xFF}, + {0x9b00 & 0xFF, 0x9bff & 0xFF}, + {0x9c00 & 0xFF, 0x9cff & 0xFF}, + {0x9d00 & 0xFF, 0x9dff & 0xFF}, + {0x9e00 & 0xFF, 0x9eff & 0xFF}, + {0x9f00 & 0xFF, 0x9fff & 0xFF}, + {0xa000 & 0xFF, 0xa014 & 0xFF}, + {0xa015 & 0xFF, 0xa015 & 0xFF}, + {0xa016 & 0xFF, 0xa0ff & 0xFF}, + {0xa100 & 0xFF, 0xa1ff & 0xFF}, + {0xa200 & 0xFF, 0xa2ff & 0xFF}, + {0xa300 & 0xFF, 0xa3ff & 0xFF}, + {0xa400 & 0xFF, 0xa48c & 0xFF}, + {0xa490 & 0xFF, 0xa4c6 & 0xFF}, + {0xa4d0 & 0xFF, 0xa4fd & 0xFF}, + {0xa4fe & 0xFF, 0xa4ff & 0xFF}, + {0xa500 & 0xFF, 0xa5ff & 0xFF}, + {0xa600 & 0xFF, 0xa60c & 0xFF}, + {0xa60d & 0xFF, 0xa60d & 0xFF}, + {0xa60e & 0xFF, 0xa60e & 0xFF}, + {0xa60f & 0xFF, 0xa60f & 0xFF}, + {0xa610 & 0xFF, 0xa61f & 0xFF}, + {0xa620 & 0xFF, 0xa629 & 0xFF}, + {0xa62a & 0xFF, 0xa62b & 0xFF}, + {0xa640 & 0xFF, 0xa66e & 0xFF}, + {0xa66f & 0xFF, 0xa672 & 0xFF}, + {0xa673 & 0xFF, 0xa673 & 0xFF}, + {0xa67c & 0xFF, 0xa67d & 0xFF}, + {0xa67e & 0xFF, 0xa697 & 0xFF}, + {0xa6a0 & 0xFF, 0xa6ef & 0xFF}, + {0xa6f0 & 0xFF, 0xa6f1 & 0xFF}, + {0xa6f2 & 0xFF, 0xa6f2 & 0xFF}, + {0xa6f3 & 0xFF, 0xa6f7 & 0xFF}, + {0xa700 & 0xFF, 0xa78e & 0xFF}, + {0xa790 & 0xFF, 0xa791 & 0xFF}, + {0xa7a0 & 0xFF, 0xa7a9 & 0xFF}, + {0xa7fa & 0xFF, 0xa7ff & 0xFF}, + {0xa800 & 0xFF, 0xa801 & 0xFF}, + {0xa802 & 0xFF, 0xa802 & 0xFF}, + {0xa803 & 0xFF, 0xa805 & 0xFF}, + {0xa806 & 0xFF, 0xa806 & 0xFF}, + {0xa807 & 0xFF, 0xa80a & 0xFF}, + {0xa80b & 0xFF, 0xa80b & 0xFF}, + {0xa80c & 0xFF, 0xa822 & 0xFF}, + {0xa823 & 0xFF, 0xa827 & 0xFF}, + {0xa828 & 0xFF, 0xa82b & 0xFF}, + {0xa830 & 0xFF, 0xa837 & 0xFF}, + {0xa838 & 0xFF, 0xa838 & 0xFF}, + {0xa839 & 0xFF, 0xa839 & 0xFF}, + {0xa840 & 0xFF, 0xa873 & 0xFF}, + {0xa874 & 0xFF, 0xa875 & 0xFF}, + {0xa876 & 0xFF, 0xa877 & 0xFF}, + {0xa880 & 0xFF, 0xa881 & 0xFF}, + {0xa882 & 0xFF, 0xa8b3 & 0xFF}, + {0xa8b4 & 0xFF, 0xa8c4 & 0xFF}, + {0xa8ce & 0xFF, 0xa8cf & 0xFF}, + {0xa8d0 & 0xFF, 0xa8d9 & 0xFF}, + {0xa8e0 & 0xFF, 0xa8f1 & 0xFF}, + {0xa8f2 & 0xFF, 0xa8fb & 0xFF}, + {0xa900 & 0xFF, 0xa909 & 0xFF}, + {0xa90a & 0xFF, 0xa925 & 0xFF}, + {0xa926 & 0xFF, 0xa92d & 0xFF}, + {0xa92e & 0xFF, 0xa92f & 0xFF}, + {0xa930 & 0xFF, 0xa946 & 0xFF}, + {0xa947 & 0xFF, 0xa953 & 0xFF}, + {0xa95f & 0xFF, 0xa95f & 0xFF}, + {0xa960 & 0xFF, 0xa97c & 0xFF}, + {0xa980 & 0xFF, 0xa983 & 0xFF}, + {0xa984 & 0xFF, 0xa9b2 & 0xFF}, + {0xa9b3 & 0xFF, 0xa9c0 & 0xFF}, + {0xa9c1 & 0xFF, 0xa9c6 & 0xFF}, + {0xa9c7 & 0xFF, 0xa9c9 & 0xFF}, + {0xa9ca & 0xFF, 0xa9cd & 0xFF}, + {0xa9cf & 0xFF, 0xa9cf & 0xFF}, + {0xa9d0 & 0xFF, 0xa9d9 & 0xFF}, + {0xa9de & 0xFF, 0xa9df & 0xFF}, + {0xaa00 & 0xFF, 0xaa28 & 0xFF}, + {0xaa29 & 0xFF, 0xaa36 & 0xFF}, + {0xaa40 & 0xFF, 0xaa42 & 0xFF}, + {0xaa43 & 0xFF, 0xaa43 & 0xFF}, + {0xaa44 & 0xFF, 0xaa4b & 0xFF}, + {0xaa4c & 0xFF, 0xaa4d & 0xFF}, + {0xaa50 & 0xFF, 0xaa59 & 0xFF}, + {0xaa5c & 0xFF, 0xaa5c & 0xFF}, + {0xaa5d & 0xFF, 0xaa5f & 0xFF}, + {0xaa60 & 0xFF, 0xaa7a & 0xFF}, + {0xaa7b & 0xFF, 0xaa7b & 0xFF}, + {0xaa80 & 0xFF, 0xaaaf & 0xFF}, + {0xaab0 & 0xFF, 0xaab0 & 0xFF}, + {0xaab1 & 0xFF, 0xaab1 & 0xFF}, + {0xaab2 & 0xFF, 0xaab4 & 0xFF}, + {0xaab5 & 0xFF, 0xaab6 & 0xFF}, + {0xaab7 & 0xFF, 0xaab8 & 0xFF}, + {0xaab9 & 0xFF, 0xaabd & 0xFF}, + {0xaabe & 0xFF, 0xaabf & 0xFF}, + {0xaac0 & 0xFF, 0xaac0 & 0xFF}, + {0xaac1 & 0xFF, 0xaac1 & 0xFF}, + {0xaac2 & 0xFF, 0xaac2 & 0xFF}, + {0xaadb & 0xFF, 0xaadf & 0xFF}, + {0xab01 & 0xFF, 0xab06 & 0xFF}, + {0xab09 & 0xFF, 0xab0e & 0xFF}, + {0xab11 & 0xFF, 0xab16 & 0xFF}, + {0xab20 & 0xFF, 0xab26 & 0xFF}, + {0xab28 & 0xFF, 0xab2e & 0xFF}, + {0xabc0 & 0xFF, 0xabe2 & 0xFF}, + {0xabe3 & 0xFF, 0xabea & 0xFF}, + {0xabeb & 0xFF, 0xabeb & 0xFF}, + {0xabec & 0xFF, 0xabed & 0xFF}, + {0xabf0 & 0xFF, 0xabf9 & 0xFF}, + {0xac00 & 0xFF, 0xac00 & 0xFF}, + {0xac01 & 0xFF, 0xac1b & 0xFF}, + {0xac1c & 0xFF, 0xac1c & 0xFF}, + {0xac1d & 0xFF, 0xac37 & 0xFF}, + {0xac38 & 0xFF, 0xac38 & 0xFF}, + {0xac39 & 0xFF, 0xac53 & 0xFF}, + {0xac54 & 0xFF, 0xac54 & 0xFF}, + {0xac55 & 0xFF, 0xac6f & 0xFF}, + {0xac70 & 0xFF, 0xac70 & 0xFF}, + {0xac71 & 0xFF, 0xac8b & 0xFF}, + {0xac8c & 0xFF, 0xac8c & 0xFF}, + {0xac8d & 0xFF, 0xaca7 & 0xFF}, + {0xaca8 & 0xFF, 0xaca8 & 0xFF}, + {0xaca9 & 0xFF, 0xacc3 & 0xFF}, + {0xacc4 & 0xFF, 0xacc4 & 0xFF}, + {0xacc5 & 0xFF, 0xacdf & 0xFF}, + {0xace0 & 0xFF, 0xace0 & 0xFF}, + {0xace1 & 0xFF, 0xacfb & 0xFF}, + {0xacfc & 0xFF, 0xacfc & 0xFF}, + {0xacfd & 0xFF, 0xacff & 0xFF}, + {0xad00 & 0xFF, 0xad17 & 0xFF}, + {0xad18 & 0xFF, 0xad18 & 0xFF}, + {0xad19 & 0xFF, 0xad33 & 0xFF}, + {0xad34 & 0xFF, 0xad34 & 0xFF}, + {0xad35 & 0xFF, 0xad4f & 0xFF}, + {0xad50 & 0xFF, 0xad50 & 0xFF}, + {0xad51 & 0xFF, 0xad6b & 0xFF}, + {0xad6c & 0xFF, 0xad6c & 0xFF}, + {0xad6d & 0xFF, 0xad87 & 0xFF}, + {0xad88 & 0xFF, 0xad88 & 0xFF}, + {0xad89 & 0xFF, 0xada3 & 0xFF}, + {0xada4 & 0xFF, 0xada4 & 0xFF}, + {0xada5 & 0xFF, 0xadbf & 0xFF}, + {0xadc0 & 0xFF, 0xadc0 & 0xFF}, + {0xadc1 & 0xFF, 0xaddb & 0xFF}, + {0xaddc & 0xFF, 0xaddc & 0xFF}, + {0xaddd & 0xFF, 0xadf7 & 0xFF}, + {0xadf8 & 0xFF, 0xadf8 & 0xFF}, + {0xadf9 & 0xFF, 0xadff & 0xFF}, + {0xae00 & 0xFF, 0xae13 & 0xFF}, + {0xae14 & 0xFF, 0xae14 & 0xFF}, + {0xae15 & 0xFF, 0xae2f & 0xFF}, + {0xae30 & 0xFF, 0xae30 & 0xFF}, + {0xae31 & 0xFF, 0xae4b & 0xFF}, + {0xae4c & 0xFF, 0xae4c & 0xFF}, + {0xae4d & 0xFF, 0xae67 & 0xFF}, + {0xae68 & 0xFF, 0xae68 & 0xFF}, + {0xae69 & 0xFF, 0xae83 & 0xFF}, + {0xae84 & 0xFF, 0xae84 & 0xFF}, + {0xae85 & 0xFF, 0xae9f & 0xFF}, + {0xaea0 & 0xFF, 0xaea0 & 0xFF}, + {0xaea1 & 0xFF, 0xaebb & 0xFF}, + {0xaebc & 0xFF, 0xaebc & 0xFF}, + {0xaebd & 0xFF, 0xaed7 & 0xFF}, + {0xaed8 & 0xFF, 0xaed8 & 0xFF}, + {0xaed9 & 0xFF, 0xaef3 & 0xFF}, + {0xaef4 & 0xFF, 0xaef4 & 0xFF}, + {0xaef5 & 0xFF, 0xaeff & 0xFF}, + {0xaf00 & 0xFF, 0xaf0f & 0xFF}, + {0xaf10 & 0xFF, 0xaf10 & 0xFF}, + {0xaf11 & 0xFF, 0xaf2b & 0xFF}, + {0xaf2c & 0xFF, 0xaf2c & 0xFF}, + {0xaf2d & 0xFF, 0xaf47 & 0xFF}, + {0xaf48 & 0xFF, 0xaf48 & 0xFF}, + {0xaf49 & 0xFF, 0xaf63 & 0xFF}, + {0xaf64 & 0xFF, 0xaf64 & 0xFF}, + {0xaf65 & 0xFF, 0xaf7f & 0xFF}, + {0xaf80 & 0xFF, 0xaf80 & 0xFF}, + {0xaf81 & 0xFF, 0xaf9b & 0xFF}, + {0xaf9c & 0xFF, 0xaf9c & 0xFF}, + {0xaf9d & 0xFF, 0xafb7 & 0xFF}, + {0xafb8 & 0xFF, 0xafb8 & 0xFF}, + {0xafb9 & 0xFF, 0xafd3 & 0xFF}, + {0xafd4 & 0xFF, 0xafd4 & 0xFF}, + {0xafd5 & 0xFF, 0xafef & 0xFF}, + {0xaff0 & 0xFF, 0xaff0 & 0xFF}, + {0xaff1 & 0xFF, 0xafff & 0xFF}, + {0xb000 & 0xFF, 0xb00b & 0xFF}, + {0xb00c & 0xFF, 0xb00c & 0xFF}, + {0xb00d & 0xFF, 0xb027 & 0xFF}, + {0xb028 & 0xFF, 0xb028 & 0xFF}, + {0xb029 & 0xFF, 0xb043 & 0xFF}, + {0xb044 & 0xFF, 0xb044 & 0xFF}, + {0xb045 & 0xFF, 0xb05f & 0xFF}, + {0xb060 & 0xFF, 0xb060 & 0xFF}, + {0xb061 & 0xFF, 0xb07b & 0xFF}, + {0xb07c & 0xFF, 0xb07c & 0xFF}, + {0xb07d & 0xFF, 0xb097 & 0xFF}, + {0xb098 & 0xFF, 0xb098 & 0xFF}, + {0xb099 & 0xFF, 0xb0b3 & 0xFF}, + {0xb0b4 & 0xFF, 0xb0b4 & 0xFF}, + {0xb0b5 & 0xFF, 0xb0cf & 0xFF}, + {0xb0d0 & 0xFF, 0xb0d0 & 0xFF}, + {0xb0d1 & 0xFF, 0xb0eb & 0xFF}, + {0xb0ec & 0xFF, 0xb0ec & 0xFF}, + {0xb0ed & 0xFF, 0xb0ff & 0xFF}, + {0xb100 & 0xFF, 0xb107 & 0xFF}, + {0xb108 & 0xFF, 0xb108 & 0xFF}, + {0xb109 & 0xFF, 0xb123 & 0xFF}, + {0xb124 & 0xFF, 0xb124 & 0xFF}, + {0xb125 & 0xFF, 0xb13f & 0xFF}, + {0xb140 & 0xFF, 0xb140 & 0xFF}, + {0xb141 & 0xFF, 0xb15b & 0xFF}, + {0xb15c & 0xFF, 0xb15c & 0xFF}, + {0xb15d & 0xFF, 0xb177 & 0xFF}, + {0xb178 & 0xFF, 0xb178 & 0xFF}, + {0xb179 & 0xFF, 0xb193 & 0xFF}, + {0xb194 & 0xFF, 0xb194 & 0xFF}, + {0xb195 & 0xFF, 0xb1af & 0xFF}, + {0xb1b0 & 0xFF, 0xb1b0 & 0xFF}, + {0xb1b1 & 0xFF, 0xb1cb & 0xFF}, + {0xb1cc & 0xFF, 0xb1cc & 0xFF}, + {0xb1cd & 0xFF, 0xb1e7 & 0xFF}, + {0xb1e8 & 0xFF, 0xb1e8 & 0xFF}, + {0xb1e9 & 0xFF, 0xb1ff & 0xFF}, + {0xb200 & 0xFF, 0xb203 & 0xFF}, + {0xb204 & 0xFF, 0xb204 & 0xFF}, + {0xb205 & 0xFF, 0xb21f & 0xFF}, + {0xb220 & 0xFF, 0xb220 & 0xFF}, + {0xb221 & 0xFF, 0xb23b & 0xFF}, + {0xb23c & 0xFF, 0xb23c & 0xFF}, + {0xb23d & 0xFF, 0xb257 & 0xFF}, + {0xb258 & 0xFF, 0xb258 & 0xFF}, + {0xb259 & 0xFF, 0xb273 & 0xFF}, + {0xb274 & 0xFF, 0xb274 & 0xFF}, + {0xb275 & 0xFF, 0xb28f & 0xFF}, + {0xb290 & 0xFF, 0xb290 & 0xFF}, + {0xb291 & 0xFF, 0xb2ab & 0xFF}, + {0xb2ac & 0xFF, 0xb2ac & 0xFF}, + {0xb2ad & 0xFF, 0xb2c7 & 0xFF}, + {0xb2c8 & 0xFF, 0xb2c8 & 0xFF}, + {0xb2c9 & 0xFF, 0xb2e3 & 0xFF}, + {0xb2e4 & 0xFF, 0xb2e4 & 0xFF}, + {0xb2e5 & 0xFF, 0xb2ff & 0xFF}, + {0xb300 & 0xFF, 0xb300 & 0xFF}, + {0xb301 & 0xFF, 0xb31b & 0xFF}, + {0xb31c & 0xFF, 0xb31c & 0xFF}, + {0xb31d & 0xFF, 0xb337 & 0xFF}, + {0xb338 & 0xFF, 0xb338 & 0xFF}, + {0xb339 & 0xFF, 0xb353 & 0xFF}, + {0xb354 & 0xFF, 0xb354 & 0xFF}, + {0xb355 & 0xFF, 0xb36f & 0xFF}, + {0xb370 & 0xFF, 0xb370 & 0xFF}, + {0xb371 & 0xFF, 0xb38b & 0xFF}, + {0xb38c & 0xFF, 0xb38c & 0xFF}, + {0xb38d & 0xFF, 0xb3a7 & 0xFF}, + {0xb3a8 & 0xFF, 0xb3a8 & 0xFF}, + {0xb3a9 & 0xFF, 0xb3c3 & 0xFF}, + {0xb3c4 & 0xFF, 0xb3c4 & 0xFF}, + {0xb3c5 & 0xFF, 0xb3df & 0xFF}, + {0xb3e0 & 0xFF, 0xb3e0 & 0xFF}, + {0xb3e1 & 0xFF, 0xb3fb & 0xFF}, + {0xb3fc & 0xFF, 0xb3fc & 0xFF}, + {0xb3fd & 0xFF, 0xb3ff & 0xFF}, + {0xb400 & 0xFF, 0xb417 & 0xFF}, + {0xb418 & 0xFF, 0xb418 & 0xFF}, + {0xb419 & 0xFF, 0xb433 & 0xFF}, + {0xb434 & 0xFF, 0xb434 & 0xFF}, + {0xb435 & 0xFF, 0xb44f & 0xFF}, + {0xb450 & 0xFF, 0xb450 & 0xFF}, + {0xb451 & 0xFF, 0xb46b & 0xFF}, + {0xb46c & 0xFF, 0xb46c & 0xFF}, + {0xb46d & 0xFF, 0xb487 & 0xFF}, + {0xb488 & 0xFF, 0xb488 & 0xFF}, + {0xb489 & 0xFF, 0xb4a3 & 0xFF}, + {0xb4a4 & 0xFF, 0xb4a4 & 0xFF}, + {0xb4a5 & 0xFF, 0xb4bf & 0xFF}, + {0xb4c0 & 0xFF, 0xb4c0 & 0xFF}, + {0xb4c1 & 0xFF, 0xb4db & 0xFF}, + {0xb4dc & 0xFF, 0xb4dc & 0xFF}, + {0xb4dd & 0xFF, 0xb4f7 & 0xFF}, + {0xb4f8 & 0xFF, 0xb4f8 & 0xFF}, + {0xb4f9 & 0xFF, 0xb4ff & 0xFF}, + {0xb500 & 0xFF, 0xb513 & 0xFF}, + {0xb514 & 0xFF, 0xb514 & 0xFF}, + {0xb515 & 0xFF, 0xb52f & 0xFF}, + {0xb530 & 0xFF, 0xb530 & 0xFF}, + {0xb531 & 0xFF, 0xb54b & 0xFF}, + {0xb54c & 0xFF, 0xb54c & 0xFF}, + {0xb54d & 0xFF, 0xb567 & 0xFF}, + {0xb568 & 0xFF, 0xb568 & 0xFF}, + {0xb569 & 0xFF, 0xb583 & 0xFF}, + {0xb584 & 0xFF, 0xb584 & 0xFF}, + {0xb585 & 0xFF, 0xb59f & 0xFF}, + {0xb5a0 & 0xFF, 0xb5a0 & 0xFF}, + {0xb5a1 & 0xFF, 0xb5bb & 0xFF}, + {0xb5bc & 0xFF, 0xb5bc & 0xFF}, + {0xb5bd & 0xFF, 0xb5d7 & 0xFF}, + {0xb5d8 & 0xFF, 0xb5d8 & 0xFF}, + {0xb5d9 & 0xFF, 0xb5f3 & 0xFF}, + {0xb5f4 & 0xFF, 0xb5f4 & 0xFF}, + {0xb5f5 & 0xFF, 0xb5ff & 0xFF}, + {0xb600 & 0xFF, 0xb60f & 0xFF}, + {0xb610 & 0xFF, 0xb610 & 0xFF}, + {0xb611 & 0xFF, 0xb62b & 0xFF}, + {0xb62c & 0xFF, 0xb62c & 0xFF}, + {0xb62d & 0xFF, 0xb647 & 0xFF}, + {0xb648 & 0xFF, 0xb648 & 0xFF}, + {0xb649 & 0xFF, 0xb663 & 0xFF}, + {0xb664 & 0xFF, 0xb664 & 0xFF}, + {0xb665 & 0xFF, 0xb67f & 0xFF}, + {0xb680 & 0xFF, 0xb680 & 0xFF}, + {0xb681 & 0xFF, 0xb69b & 0xFF}, + {0xb69c & 0xFF, 0xb69c & 0xFF}, + {0xb69d & 0xFF, 0xb6b7 & 0xFF}, + {0xb6b8 & 0xFF, 0xb6b8 & 0xFF}, + {0xb6b9 & 0xFF, 0xb6d3 & 0xFF}, + {0xb6d4 & 0xFF, 0xb6d4 & 0xFF}, + {0xb6d5 & 0xFF, 0xb6ef & 0xFF}, + {0xb6f0 & 0xFF, 0xb6f0 & 0xFF}, + {0xb6f1 & 0xFF, 0xb6ff & 0xFF}, + {0xb700 & 0xFF, 0xb70b & 0xFF}, + {0xb70c & 0xFF, 0xb70c & 0xFF}, + {0xb70d & 0xFF, 0xb727 & 0xFF}, + {0xb728 & 0xFF, 0xb728 & 0xFF}, + {0xb729 & 0xFF, 0xb743 & 0xFF}, + {0xb744 & 0xFF, 0xb744 & 0xFF}, + {0xb745 & 0xFF, 0xb75f & 0xFF}, + {0xb760 & 0xFF, 0xb760 & 0xFF}, + {0xb761 & 0xFF, 0xb77b & 0xFF}, + {0xb77c & 0xFF, 0xb77c & 0xFF}, + {0xb77d & 0xFF, 0xb797 & 0xFF}, + {0xb798 & 0xFF, 0xb798 & 0xFF}, + {0xb799 & 0xFF, 0xb7b3 & 0xFF}, + {0xb7b4 & 0xFF, 0xb7b4 & 0xFF}, + {0xb7b5 & 0xFF, 0xb7cf & 0xFF}, + {0xb7d0 & 0xFF, 0xb7d0 & 0xFF}, + {0xb7d1 & 0xFF, 0xb7eb & 0xFF}, + {0xb7ec & 0xFF, 0xb7ec & 0xFF}, + {0xb7ed & 0xFF, 0xb7ff & 0xFF}, + {0xb800 & 0xFF, 0xb807 & 0xFF}, + {0xb808 & 0xFF, 0xb808 & 0xFF}, + {0xb809 & 0xFF, 0xb823 & 0xFF}, + {0xb824 & 0xFF, 0xb824 & 0xFF}, + {0xb825 & 0xFF, 0xb83f & 0xFF}, + {0xb840 & 0xFF, 0xb840 & 0xFF}, + {0xb841 & 0xFF, 0xb85b & 0xFF}, + {0xb85c & 0xFF, 0xb85c & 0xFF}, + {0xb85d & 0xFF, 0xb877 & 0xFF}, + {0xb878 & 0xFF, 0xb878 & 0xFF}, + {0xb879 & 0xFF, 0xb893 & 0xFF}, + {0xb894 & 0xFF, 0xb894 & 0xFF}, + {0xb895 & 0xFF, 0xb8af & 0xFF}, + {0xb8b0 & 0xFF, 0xb8b0 & 0xFF}, + {0xb8b1 & 0xFF, 0xb8cb & 0xFF}, + {0xb8cc & 0xFF, 0xb8cc & 0xFF}, + {0xb8cd & 0xFF, 0xb8e7 & 0xFF}, + {0xb8e8 & 0xFF, 0xb8e8 & 0xFF}, + {0xb8e9 & 0xFF, 0xb8ff & 0xFF}, + {0xb900 & 0xFF, 0xb903 & 0xFF}, + {0xb904 & 0xFF, 0xb904 & 0xFF}, + {0xb905 & 0xFF, 0xb91f & 0xFF}, + {0xb920 & 0xFF, 0xb920 & 0xFF}, + {0xb921 & 0xFF, 0xb93b & 0xFF}, + {0xb93c & 0xFF, 0xb93c & 0xFF}, + {0xb93d & 0xFF, 0xb957 & 0xFF}, + {0xb958 & 0xFF, 0xb958 & 0xFF}, + {0xb959 & 0xFF, 0xb973 & 0xFF}, + {0xb974 & 0xFF, 0xb974 & 0xFF}, + {0xb975 & 0xFF, 0xb98f & 0xFF}, + {0xb990 & 0xFF, 0xb990 & 0xFF}, + {0xb991 & 0xFF, 0xb9ab & 0xFF}, + {0xb9ac & 0xFF, 0xb9ac & 0xFF}, + {0xb9ad & 0xFF, 0xb9c7 & 0xFF}, + {0xb9c8 & 0xFF, 0xb9c8 & 0xFF}, + {0xb9c9 & 0xFF, 0xb9e3 & 0xFF}, + {0xb9e4 & 0xFF, 0xb9e4 & 0xFF}, + {0xb9e5 & 0xFF, 0xb9ff & 0xFF}, + {0xba00 & 0xFF, 0xba00 & 0xFF}, + {0xba01 & 0xFF, 0xba1b & 0xFF}, + {0xba1c & 0xFF, 0xba1c & 0xFF}, + {0xba1d & 0xFF, 0xba37 & 0xFF}, + {0xba38 & 0xFF, 0xba38 & 0xFF}, + {0xba39 & 0xFF, 0xba53 & 0xFF}, + {0xba54 & 0xFF, 0xba54 & 0xFF}, + {0xba55 & 0xFF, 0xba6f & 0xFF}, + {0xba70 & 0xFF, 0xba70 & 0xFF}, + {0xba71 & 0xFF, 0xba8b & 0xFF}, + {0xba8c & 0xFF, 0xba8c & 0xFF}, + {0xba8d & 0xFF, 0xbaa7 & 0xFF}, + {0xbaa8 & 0xFF, 0xbaa8 & 0xFF}, + {0xbaa9 & 0xFF, 0xbac3 & 0xFF}, + {0xbac4 & 0xFF, 0xbac4 & 0xFF}, + {0xbac5 & 0xFF, 0xbadf & 0xFF}, + {0xbae0 & 0xFF, 0xbae0 & 0xFF}, + {0xbae1 & 0xFF, 0xbafb & 0xFF}, + {0xbafc & 0xFF, 0xbafc & 0xFF}, + {0xbafd & 0xFF, 0xbaff & 0xFF}, + {0xbb00 & 0xFF, 0xbb17 & 0xFF}, + {0xbb18 & 0xFF, 0xbb18 & 0xFF}, + {0xbb19 & 0xFF, 0xbb33 & 0xFF}, + {0xbb34 & 0xFF, 0xbb34 & 0xFF}, + {0xbb35 & 0xFF, 0xbb4f & 0xFF}, + {0xbb50 & 0xFF, 0xbb50 & 0xFF}, + {0xbb51 & 0xFF, 0xbb6b & 0xFF}, + {0xbb6c & 0xFF, 0xbb6c & 0xFF}, + {0xbb6d & 0xFF, 0xbb87 & 0xFF}, + {0xbb88 & 0xFF, 0xbb88 & 0xFF}, + {0xbb89 & 0xFF, 0xbba3 & 0xFF}, + {0xbba4 & 0xFF, 0xbba4 & 0xFF}, + {0xbba5 & 0xFF, 0xbbbf & 0xFF}, + {0xbbc0 & 0xFF, 0xbbc0 & 0xFF}, + {0xbbc1 & 0xFF, 0xbbdb & 0xFF}, + {0xbbdc & 0xFF, 0xbbdc & 0xFF}, + {0xbbdd & 0xFF, 0xbbf7 & 0xFF}, + {0xbbf8 & 0xFF, 0xbbf8 & 0xFF}, + {0xbbf9 & 0xFF, 0xbbff & 0xFF}, + {0xbc00 & 0xFF, 0xbc13 & 0xFF}, + {0xbc14 & 0xFF, 0xbc14 & 0xFF}, + {0xbc15 & 0xFF, 0xbc2f & 0xFF}, + {0xbc30 & 0xFF, 0xbc30 & 0xFF}, + {0xbc31 & 0xFF, 0xbc4b & 0xFF}, + {0xbc4c & 0xFF, 0xbc4c & 0xFF}, + {0xbc4d & 0xFF, 0xbc67 & 0xFF}, + {0xbc68 & 0xFF, 0xbc68 & 0xFF}, + {0xbc69 & 0xFF, 0xbc83 & 0xFF}, + {0xbc84 & 0xFF, 0xbc84 & 0xFF}, + {0xbc85 & 0xFF, 0xbc9f & 0xFF}, + {0xbca0 & 0xFF, 0xbca0 & 0xFF}, + {0xbca1 & 0xFF, 0xbcbb & 0xFF}, + {0xbcbc & 0xFF, 0xbcbc & 0xFF}, + {0xbcbd & 0xFF, 0xbcd7 & 0xFF}, + {0xbcd8 & 0xFF, 0xbcd8 & 0xFF}, + {0xbcd9 & 0xFF, 0xbcf3 & 0xFF}, + {0xbcf4 & 0xFF, 0xbcf4 & 0xFF}, + {0xbcf5 & 0xFF, 0xbcff & 0xFF}, + {0xbd00 & 0xFF, 0xbd0f & 0xFF}, + {0xbd10 & 0xFF, 0xbd10 & 0xFF}, + {0xbd11 & 0xFF, 0xbd2b & 0xFF}, + {0xbd2c & 0xFF, 0xbd2c & 0xFF}, + {0xbd2d & 0xFF, 0xbd47 & 0xFF}, + {0xbd48 & 0xFF, 0xbd48 & 0xFF}, + {0xbd49 & 0xFF, 0xbd63 & 0xFF}, + {0xbd64 & 0xFF, 0xbd64 & 0xFF}, + {0xbd65 & 0xFF, 0xbd7f & 0xFF}, + {0xbd80 & 0xFF, 0xbd80 & 0xFF}, + {0xbd81 & 0xFF, 0xbd9b & 0xFF}, + {0xbd9c & 0xFF, 0xbd9c & 0xFF}, + {0xbd9d & 0xFF, 0xbdb7 & 0xFF}, + {0xbdb8 & 0xFF, 0xbdb8 & 0xFF}, + {0xbdb9 & 0xFF, 0xbdd3 & 0xFF}, + {0xbdd4 & 0xFF, 0xbdd4 & 0xFF}, + {0xbdd5 & 0xFF, 0xbdef & 0xFF}, + {0xbdf0 & 0xFF, 0xbdf0 & 0xFF}, + {0xbdf1 & 0xFF, 0xbdff & 0xFF}, + {0xbe00 & 0xFF, 0xbe0b & 0xFF}, + {0xbe0c & 0xFF, 0xbe0c & 0xFF}, + {0xbe0d & 0xFF, 0xbe27 & 0xFF}, + {0xbe28 & 0xFF, 0xbe28 & 0xFF}, + {0xbe29 & 0xFF, 0xbe43 & 0xFF}, + {0xbe44 & 0xFF, 0xbe44 & 0xFF}, + {0xbe45 & 0xFF, 0xbe5f & 0xFF}, + {0xbe60 & 0xFF, 0xbe60 & 0xFF}, + {0xbe61 & 0xFF, 0xbe7b & 0xFF}, + {0xbe7c & 0xFF, 0xbe7c & 0xFF}, + {0xbe7d & 0xFF, 0xbe97 & 0xFF}, + {0xbe98 & 0xFF, 0xbe98 & 0xFF}, + {0xbe99 & 0xFF, 0xbeb3 & 0xFF}, + {0xbeb4 & 0xFF, 0xbeb4 & 0xFF}, + {0xbeb5 & 0xFF, 0xbecf & 0xFF}, + {0xbed0 & 0xFF, 0xbed0 & 0xFF}, + {0xbed1 & 0xFF, 0xbeeb & 0xFF}, + {0xbeec & 0xFF, 0xbeec & 0xFF}, + {0xbeed & 0xFF, 0xbeff & 0xFF}, + {0xbf00 & 0xFF, 0xbf07 & 0xFF}, + {0xbf08 & 0xFF, 0xbf08 & 0xFF}, + {0xbf09 & 0xFF, 0xbf23 & 0xFF}, + {0xbf24 & 0xFF, 0xbf24 & 0xFF}, + {0xbf25 & 0xFF, 0xbf3f & 0xFF}, + {0xbf40 & 0xFF, 0xbf40 & 0xFF}, + {0xbf41 & 0xFF, 0xbf5b & 0xFF}, + {0xbf5c & 0xFF, 0xbf5c & 0xFF}, + {0xbf5d & 0xFF, 0xbf77 & 0xFF}, + {0xbf78 & 0xFF, 0xbf78 & 0xFF}, + {0xbf79 & 0xFF, 0xbf93 & 0xFF}, + {0xbf94 & 0xFF, 0xbf94 & 0xFF}, + {0xbf95 & 0xFF, 0xbfaf & 0xFF}, + {0xbfb0 & 0xFF, 0xbfb0 & 0xFF}, + {0xbfb1 & 0xFF, 0xbfcb & 0xFF}, + {0xbfcc & 0xFF, 0xbfcc & 0xFF}, + {0xbfcd & 0xFF, 0xbfe7 & 0xFF}, + {0xbfe8 & 0xFF, 0xbfe8 & 0xFF}, + {0xbfe9 & 0xFF, 0xbfff & 0xFF}, + {0xc000 & 0xFF, 0xc003 & 0xFF}, + {0xc004 & 0xFF, 0xc004 & 0xFF}, + {0xc005 & 0xFF, 0xc01f & 0xFF}, + {0xc020 & 0xFF, 0xc020 & 0xFF}, + {0xc021 & 0xFF, 0xc03b & 0xFF}, + {0xc03c & 0xFF, 0xc03c & 0xFF}, + {0xc03d & 0xFF, 0xc057 & 0xFF}, + {0xc058 & 0xFF, 0xc058 & 0xFF}, + {0xc059 & 0xFF, 0xc073 & 0xFF}, + {0xc074 & 0xFF, 0xc074 & 0xFF}, + {0xc075 & 0xFF, 0xc08f & 0xFF}, + {0xc090 & 0xFF, 0xc090 & 0xFF}, + {0xc091 & 0xFF, 0xc0ab & 0xFF}, + {0xc0ac & 0xFF, 0xc0ac & 0xFF}, + {0xc0ad & 0xFF, 0xc0c7 & 0xFF}, + {0xc0c8 & 0xFF, 0xc0c8 & 0xFF}, + {0xc0c9 & 0xFF, 0xc0e3 & 0xFF}, + {0xc0e4 & 0xFF, 0xc0e4 & 0xFF}, + {0xc0e5 & 0xFF, 0xc0ff & 0xFF}, + {0xc100 & 0xFF, 0xc100 & 0xFF}, + {0xc101 & 0xFF, 0xc11b & 0xFF}, + {0xc11c & 0xFF, 0xc11c & 0xFF}, + {0xc11d & 0xFF, 0xc137 & 0xFF}, + {0xc138 & 0xFF, 0xc138 & 0xFF}, + {0xc139 & 0xFF, 0xc153 & 0xFF}, + {0xc154 & 0xFF, 0xc154 & 0xFF}, + {0xc155 & 0xFF, 0xc16f & 0xFF}, + {0xc170 & 0xFF, 0xc170 & 0xFF}, + {0xc171 & 0xFF, 0xc18b & 0xFF}, + {0xc18c & 0xFF, 0xc18c & 0xFF}, + {0xc18d & 0xFF, 0xc1a7 & 0xFF}, + {0xc1a8 & 0xFF, 0xc1a8 & 0xFF}, + {0xc1a9 & 0xFF, 0xc1c3 & 0xFF}, + {0xc1c4 & 0xFF, 0xc1c4 & 0xFF}, + {0xc1c5 & 0xFF, 0xc1df & 0xFF}, + {0xc1e0 & 0xFF, 0xc1e0 & 0xFF}, + {0xc1e1 & 0xFF, 0xc1fb & 0xFF}, + {0xc1fc & 0xFF, 0xc1fc & 0xFF}, + {0xc1fd & 0xFF, 0xc1ff & 0xFF}, + {0xc200 & 0xFF, 0xc217 & 0xFF}, + {0xc218 & 0xFF, 0xc218 & 0xFF}, + {0xc219 & 0xFF, 0xc233 & 0xFF}, + {0xc234 & 0xFF, 0xc234 & 0xFF}, + {0xc235 & 0xFF, 0xc24f & 0xFF}, + {0xc250 & 0xFF, 0xc250 & 0xFF}, + {0xc251 & 0xFF, 0xc26b & 0xFF}, + {0xc26c & 0xFF, 0xc26c & 0xFF}, + {0xc26d & 0xFF, 0xc287 & 0xFF}, + {0xc288 & 0xFF, 0xc288 & 0xFF}, + {0xc289 & 0xFF, 0xc2a3 & 0xFF}, + {0xc2a4 & 0xFF, 0xc2a4 & 0xFF}, + {0xc2a5 & 0xFF, 0xc2bf & 0xFF}, + {0xc2c0 & 0xFF, 0xc2c0 & 0xFF}, + {0xc2c1 & 0xFF, 0xc2db & 0xFF}, + {0xc2dc & 0xFF, 0xc2dc & 0xFF}, + {0xc2dd & 0xFF, 0xc2f7 & 0xFF}, + {0xc2f8 & 0xFF, 0xc2f8 & 0xFF}, + {0xc2f9 & 0xFF, 0xc2ff & 0xFF}, + {0xc300 & 0xFF, 0xc313 & 0xFF}, + {0xc314 & 0xFF, 0xc314 & 0xFF}, + {0xc315 & 0xFF, 0xc32f & 0xFF}, + {0xc330 & 0xFF, 0xc330 & 0xFF}, + {0xc331 & 0xFF, 0xc34b & 0xFF}, + {0xc34c & 0xFF, 0xc34c & 0xFF}, + {0xc34d & 0xFF, 0xc367 & 0xFF}, + {0xc368 & 0xFF, 0xc368 & 0xFF}, + {0xc369 & 0xFF, 0xc383 & 0xFF}, + {0xc384 & 0xFF, 0xc384 & 0xFF}, + {0xc385 & 0xFF, 0xc39f & 0xFF}, + {0xc3a0 & 0xFF, 0xc3a0 & 0xFF}, + {0xc3a1 & 0xFF, 0xc3bb & 0xFF}, + {0xc3bc & 0xFF, 0xc3bc & 0xFF}, + {0xc3bd & 0xFF, 0xc3d7 & 0xFF}, + {0xc3d8 & 0xFF, 0xc3d8 & 0xFF}, + {0xc3d9 & 0xFF, 0xc3f3 & 0xFF}, + {0xc3f4 & 0xFF, 0xc3f4 & 0xFF}, + {0xc3f5 & 0xFF, 0xc3ff & 0xFF}, + {0xc400 & 0xFF, 0xc40f & 0xFF}, + {0xc410 & 0xFF, 0xc410 & 0xFF}, + {0xc411 & 0xFF, 0xc42b & 0xFF}, + {0xc42c & 0xFF, 0xc42c & 0xFF}, + {0xc42d & 0xFF, 0xc447 & 0xFF}, + {0xc448 & 0xFF, 0xc448 & 0xFF}, + {0xc449 & 0xFF, 0xc463 & 0xFF}, + {0xc464 & 0xFF, 0xc464 & 0xFF}, + {0xc465 & 0xFF, 0xc47f & 0xFF}, + {0xc480 & 0xFF, 0xc480 & 0xFF}, + {0xc481 & 0xFF, 0xc49b & 0xFF}, + {0xc49c & 0xFF, 0xc49c & 0xFF}, + {0xc49d & 0xFF, 0xc4b7 & 0xFF}, + {0xc4b8 & 0xFF, 0xc4b8 & 0xFF}, + {0xc4b9 & 0xFF, 0xc4d3 & 0xFF}, + {0xc4d4 & 0xFF, 0xc4d4 & 0xFF}, + {0xc4d5 & 0xFF, 0xc4ef & 0xFF}, + {0xc4f0 & 0xFF, 0xc4f0 & 0xFF}, + {0xc4f1 & 0xFF, 0xc4ff & 0xFF}, + {0xc500 & 0xFF, 0xc50b & 0xFF}, + {0xc50c & 0xFF, 0xc50c & 0xFF}, + {0xc50d & 0xFF, 0xc527 & 0xFF}, + {0xc528 & 0xFF, 0xc528 & 0xFF}, + {0xc529 & 0xFF, 0xc543 & 0xFF}, + {0xc544 & 0xFF, 0xc544 & 0xFF}, + {0xc545 & 0xFF, 0xc55f & 0xFF}, + {0xc560 & 0xFF, 0xc560 & 0xFF}, + {0xc561 & 0xFF, 0xc57b & 0xFF}, + {0xc57c & 0xFF, 0xc57c & 0xFF}, + {0xc57d & 0xFF, 0xc597 & 0xFF}, + {0xc598 & 0xFF, 0xc598 & 0xFF}, + {0xc599 & 0xFF, 0xc5b3 & 0xFF}, + {0xc5b4 & 0xFF, 0xc5b4 & 0xFF}, + {0xc5b5 & 0xFF, 0xc5cf & 0xFF}, + {0xc5d0 & 0xFF, 0xc5d0 & 0xFF}, + {0xc5d1 & 0xFF, 0xc5eb & 0xFF}, + {0xc5ec & 0xFF, 0xc5ec & 0xFF}, + {0xc5ed & 0xFF, 0xc5ff & 0xFF}, + {0xc600 & 0xFF, 0xc607 & 0xFF}, + {0xc608 & 0xFF, 0xc608 & 0xFF}, + {0xc609 & 0xFF, 0xc623 & 0xFF}, + {0xc624 & 0xFF, 0xc624 & 0xFF}, + {0xc625 & 0xFF, 0xc63f & 0xFF}, + {0xc640 & 0xFF, 0xc640 & 0xFF}, + {0xc641 & 0xFF, 0xc65b & 0xFF}, + {0xc65c & 0xFF, 0xc65c & 0xFF}, + {0xc65d & 0xFF, 0xc677 & 0xFF}, + {0xc678 & 0xFF, 0xc678 & 0xFF}, + {0xc679 & 0xFF, 0xc693 & 0xFF}, + {0xc694 & 0xFF, 0xc694 & 0xFF}, + {0xc695 & 0xFF, 0xc6af & 0xFF}, + {0xc6b0 & 0xFF, 0xc6b0 & 0xFF}, + {0xc6b1 & 0xFF, 0xc6cb & 0xFF}, + {0xc6cc & 0xFF, 0xc6cc & 0xFF}, + {0xc6cd & 0xFF, 0xc6e7 & 0xFF}, + {0xc6e8 & 0xFF, 0xc6e8 & 0xFF}, + {0xc6e9 & 0xFF, 0xc6ff & 0xFF}, + {0xc700 & 0xFF, 0xc703 & 0xFF}, + {0xc704 & 0xFF, 0xc704 & 0xFF}, + {0xc705 & 0xFF, 0xc71f & 0xFF}, + {0xc720 & 0xFF, 0xc720 & 0xFF}, + {0xc721 & 0xFF, 0xc73b & 0xFF}, + {0xc73c & 0xFF, 0xc73c & 0xFF}, + {0xc73d & 0xFF, 0xc757 & 0xFF}, + {0xc758 & 0xFF, 0xc758 & 0xFF}, + {0xc759 & 0xFF, 0xc773 & 0xFF}, + {0xc774 & 0xFF, 0xc774 & 0xFF}, + {0xc775 & 0xFF, 0xc78f & 0xFF}, + {0xc790 & 0xFF, 0xc790 & 0xFF}, + {0xc791 & 0xFF, 0xc7ab & 0xFF}, + {0xc7ac & 0xFF, 0xc7ac & 0xFF}, + {0xc7ad & 0xFF, 0xc7c7 & 0xFF}, + {0xc7c8 & 0xFF, 0xc7c8 & 0xFF}, + {0xc7c9 & 0xFF, 0xc7e3 & 0xFF}, + {0xc7e4 & 0xFF, 0xc7e4 & 0xFF}, + {0xc7e5 & 0xFF, 0xc7ff & 0xFF}, + {0xc800 & 0xFF, 0xc800 & 0xFF}, + {0xc801 & 0xFF, 0xc81b & 0xFF}, + {0xc81c & 0xFF, 0xc81c & 0xFF}, + {0xc81d & 0xFF, 0xc837 & 0xFF}, + {0xc838 & 0xFF, 0xc838 & 0xFF}, + {0xc839 & 0xFF, 0xc853 & 0xFF}, + {0xc854 & 0xFF, 0xc854 & 0xFF}, + {0xc855 & 0xFF, 0xc86f & 0xFF}, + {0xc870 & 0xFF, 0xc870 & 0xFF}, + {0xc871 & 0xFF, 0xc88b & 0xFF}, + {0xc88c & 0xFF, 0xc88c & 0xFF}, + {0xc88d & 0xFF, 0xc8a7 & 0xFF}, + {0xc8a8 & 0xFF, 0xc8a8 & 0xFF}, + {0xc8a9 & 0xFF, 0xc8c3 & 0xFF}, + {0xc8c4 & 0xFF, 0xc8c4 & 0xFF}, + {0xc8c5 & 0xFF, 0xc8df & 0xFF}, + {0xc8e0 & 0xFF, 0xc8e0 & 0xFF}, + {0xc8e1 & 0xFF, 0xc8fb & 0xFF}, + {0xc8fc & 0xFF, 0xc8fc & 0xFF}, + {0xc8fd & 0xFF, 0xc8ff & 0xFF}, + {0xc900 & 0xFF, 0xc917 & 0xFF}, + {0xc918 & 0xFF, 0xc918 & 0xFF}, + {0xc919 & 0xFF, 0xc933 & 0xFF}, + {0xc934 & 0xFF, 0xc934 & 0xFF}, + {0xc935 & 0xFF, 0xc94f & 0xFF}, + {0xc950 & 0xFF, 0xc950 & 0xFF}, + {0xc951 & 0xFF, 0xc96b & 0xFF}, + {0xc96c & 0xFF, 0xc96c & 0xFF}, + {0xc96d & 0xFF, 0xc987 & 0xFF}, + {0xc988 & 0xFF, 0xc988 & 0xFF}, + {0xc989 & 0xFF, 0xc9a3 & 0xFF}, + {0xc9a4 & 0xFF, 0xc9a4 & 0xFF}, + {0xc9a5 & 0xFF, 0xc9bf & 0xFF}, + {0xc9c0 & 0xFF, 0xc9c0 & 0xFF}, + {0xc9c1 & 0xFF, 0xc9db & 0xFF}, + {0xc9dc & 0xFF, 0xc9dc & 0xFF}, + {0xc9dd & 0xFF, 0xc9f7 & 0xFF}, + {0xc9f8 & 0xFF, 0xc9f8 & 0xFF}, + {0xc9f9 & 0xFF, 0xc9ff & 0xFF}, + {0xca00 & 0xFF, 0xca13 & 0xFF}, + {0xca14 & 0xFF, 0xca14 & 0xFF}, + {0xca15 & 0xFF, 0xca2f & 0xFF}, + {0xca30 & 0xFF, 0xca30 & 0xFF}, + {0xca31 & 0xFF, 0xca4b & 0xFF}, + {0xca4c & 0xFF, 0xca4c & 0xFF}, + {0xca4d & 0xFF, 0xca67 & 0xFF}, + {0xca68 & 0xFF, 0xca68 & 0xFF}, + {0xca69 & 0xFF, 0xca83 & 0xFF}, + {0xca84 & 0xFF, 0xca84 & 0xFF}, + {0xca85 & 0xFF, 0xca9f & 0xFF}, + {0xcaa0 & 0xFF, 0xcaa0 & 0xFF}, + {0xcaa1 & 0xFF, 0xcabb & 0xFF}, + {0xcabc & 0xFF, 0xcabc & 0xFF}, + {0xcabd & 0xFF, 0xcad7 & 0xFF}, + {0xcad8 & 0xFF, 0xcad8 & 0xFF}, + {0xcad9 & 0xFF, 0xcaf3 & 0xFF}, + {0xcaf4 & 0xFF, 0xcaf4 & 0xFF}, + {0xcaf5 & 0xFF, 0xcaff & 0xFF}, + {0xcb00 & 0xFF, 0xcb0f & 0xFF}, + {0xcb10 & 0xFF, 0xcb10 & 0xFF}, + {0xcb11 & 0xFF, 0xcb2b & 0xFF}, + {0xcb2c & 0xFF, 0xcb2c & 0xFF}, + {0xcb2d & 0xFF, 0xcb47 & 0xFF}, + {0xcb48 & 0xFF, 0xcb48 & 0xFF}, + {0xcb49 & 0xFF, 0xcb63 & 0xFF}, + {0xcb64 & 0xFF, 0xcb64 & 0xFF}, + {0xcb65 & 0xFF, 0xcb7f & 0xFF}, + {0xcb80 & 0xFF, 0xcb80 & 0xFF}, + {0xcb81 & 0xFF, 0xcb9b & 0xFF}, + {0xcb9c & 0xFF, 0xcb9c & 0xFF}, + {0xcb9d & 0xFF, 0xcbb7 & 0xFF}, + {0xcbb8 & 0xFF, 0xcbb8 & 0xFF}, + {0xcbb9 & 0xFF, 0xcbd3 & 0xFF}, + {0xcbd4 & 0xFF, 0xcbd4 & 0xFF}, + {0xcbd5 & 0xFF, 0xcbef & 0xFF}, + {0xcbf0 & 0xFF, 0xcbf0 & 0xFF}, + {0xcbf1 & 0xFF, 0xcbff & 0xFF}, + {0xcc00 & 0xFF, 0xcc0b & 0xFF}, + {0xcc0c & 0xFF, 0xcc0c & 0xFF}, + {0xcc0d & 0xFF, 0xcc27 & 0xFF}, + {0xcc28 & 0xFF, 0xcc28 & 0xFF}, + {0xcc29 & 0xFF, 0xcc43 & 0xFF}, + {0xcc44 & 0xFF, 0xcc44 & 0xFF}, + {0xcc45 & 0xFF, 0xcc5f & 0xFF}, + {0xcc60 & 0xFF, 0xcc60 & 0xFF}, + {0xcc61 & 0xFF, 0xcc7b & 0xFF}, + {0xcc7c & 0xFF, 0xcc7c & 0xFF}, + {0xcc7d & 0xFF, 0xcc97 & 0xFF}, + {0xcc98 & 0xFF, 0xcc98 & 0xFF}, + {0xcc99 & 0xFF, 0xccb3 & 0xFF}, + {0xccb4 & 0xFF, 0xccb4 & 0xFF}, + {0xccb5 & 0xFF, 0xcccf & 0xFF}, + {0xccd0 & 0xFF, 0xccd0 & 0xFF}, + {0xccd1 & 0xFF, 0xcceb & 0xFF}, + {0xccec & 0xFF, 0xccec & 0xFF}, + {0xcced & 0xFF, 0xccff & 0xFF}, + {0xcd00 & 0xFF, 0xcd07 & 0xFF}, + {0xcd08 & 0xFF, 0xcd08 & 0xFF}, + {0xcd09 & 0xFF, 0xcd23 & 0xFF}, + {0xcd24 & 0xFF, 0xcd24 & 0xFF}, + {0xcd25 & 0xFF, 0xcd3f & 0xFF}, + {0xcd40 & 0xFF, 0xcd40 & 0xFF}, + {0xcd41 & 0xFF, 0xcd5b & 0xFF}, + {0xcd5c & 0xFF, 0xcd5c & 0xFF}, + {0xcd5d & 0xFF, 0xcd77 & 0xFF}, + {0xcd78 & 0xFF, 0xcd78 & 0xFF}, + {0xcd79 & 0xFF, 0xcd93 & 0xFF}, + {0xcd94 & 0xFF, 0xcd94 & 0xFF}, + {0xcd95 & 0xFF, 0xcdaf & 0xFF}, + {0xcdb0 & 0xFF, 0xcdb0 & 0xFF}, + {0xcdb1 & 0xFF, 0xcdcb & 0xFF}, + {0xcdcc & 0xFF, 0xcdcc & 0xFF}, + {0xcdcd & 0xFF, 0xcde7 & 0xFF}, + {0xcde8 & 0xFF, 0xcde8 & 0xFF}, + {0xcde9 & 0xFF, 0xcdff & 0xFF}, + {0xce00 & 0xFF, 0xce03 & 0xFF}, + {0xce04 & 0xFF, 0xce04 & 0xFF}, + {0xce05 & 0xFF, 0xce1f & 0xFF}, + {0xce20 & 0xFF, 0xce20 & 0xFF}, + {0xce21 & 0xFF, 0xce3b & 0xFF}, + {0xce3c & 0xFF, 0xce3c & 0xFF}, + {0xce3d & 0xFF, 0xce57 & 0xFF}, + {0xce58 & 0xFF, 0xce58 & 0xFF}, + {0xce59 & 0xFF, 0xce73 & 0xFF}, + {0xce74 & 0xFF, 0xce74 & 0xFF}, + {0xce75 & 0xFF, 0xce8f & 0xFF}, + {0xce90 & 0xFF, 0xce90 & 0xFF}, + {0xce91 & 0xFF, 0xceab & 0xFF}, + {0xceac & 0xFF, 0xceac & 0xFF}, + {0xcead & 0xFF, 0xcec7 & 0xFF}, + {0xcec8 & 0xFF, 0xcec8 & 0xFF}, + {0xcec9 & 0xFF, 0xcee3 & 0xFF}, + {0xcee4 & 0xFF, 0xcee4 & 0xFF}, + {0xcee5 & 0xFF, 0xceff & 0xFF}, + {0xcf00 & 0xFF, 0xcf00 & 0xFF}, + {0xcf01 & 0xFF, 0xcf1b & 0xFF}, + {0xcf1c & 0xFF, 0xcf1c & 0xFF}, + {0xcf1d & 0xFF, 0xcf37 & 0xFF}, + {0xcf38 & 0xFF, 0xcf38 & 0xFF}, + {0xcf39 & 0xFF, 0xcf53 & 0xFF}, + {0xcf54 & 0xFF, 0xcf54 & 0xFF}, + {0xcf55 & 0xFF, 0xcf6f & 0xFF}, + {0xcf70 & 0xFF, 0xcf70 & 0xFF}, + {0xcf71 & 0xFF, 0xcf8b & 0xFF}, + {0xcf8c & 0xFF, 0xcf8c & 0xFF}, + {0xcf8d & 0xFF, 0xcfa7 & 0xFF}, + {0xcfa8 & 0xFF, 0xcfa8 & 0xFF}, + {0xcfa9 & 0xFF, 0xcfc3 & 0xFF}, + {0xcfc4 & 0xFF, 0xcfc4 & 0xFF}, + {0xcfc5 & 0xFF, 0xcfdf & 0xFF}, + {0xcfe0 & 0xFF, 0xcfe0 & 0xFF}, + {0xcfe1 & 0xFF, 0xcffb & 0xFF}, + {0xcffc & 0xFF, 0xcffc & 0xFF}, + {0xcffd & 0xFF, 0xcfff & 0xFF}, + {0xd000 & 0xFF, 0xd017 & 0xFF}, + {0xd018 & 0xFF, 0xd018 & 0xFF}, + {0xd019 & 0xFF, 0xd033 & 0xFF}, + {0xd034 & 0xFF, 0xd034 & 0xFF}, + {0xd035 & 0xFF, 0xd04f & 0xFF}, + {0xd050 & 0xFF, 0xd050 & 0xFF}, + {0xd051 & 0xFF, 0xd06b & 0xFF}, + {0xd06c & 0xFF, 0xd06c & 0xFF}, + {0xd06d & 0xFF, 0xd087 & 0xFF}, + {0xd088 & 0xFF, 0xd088 & 0xFF}, + {0xd089 & 0xFF, 0xd0a3 & 0xFF}, + {0xd0a4 & 0xFF, 0xd0a4 & 0xFF}, + {0xd0a5 & 0xFF, 0xd0bf & 0xFF}, + {0xd0c0 & 0xFF, 0xd0c0 & 0xFF}, + {0xd0c1 & 0xFF, 0xd0db & 0xFF}, + {0xd0dc & 0xFF, 0xd0dc & 0xFF}, + {0xd0dd & 0xFF, 0xd0f7 & 0xFF}, + {0xd0f8 & 0xFF, 0xd0f8 & 0xFF}, + {0xd0f9 & 0xFF, 0xd0ff & 0xFF}, + {0xd100 & 0xFF, 0xd113 & 0xFF}, + {0xd114 & 0xFF, 0xd114 & 0xFF}, + {0xd115 & 0xFF, 0xd12f & 0xFF}, + {0xd130 & 0xFF, 0xd130 & 0xFF}, + {0xd131 & 0xFF, 0xd14b & 0xFF}, + {0xd14c & 0xFF, 0xd14c & 0xFF}, + {0xd14d & 0xFF, 0xd167 & 0xFF}, + {0xd168 & 0xFF, 0xd168 & 0xFF}, + {0xd169 & 0xFF, 0xd183 & 0xFF}, + {0xd184 & 0xFF, 0xd184 & 0xFF}, + {0xd185 & 0xFF, 0xd19f & 0xFF}, + {0xd1a0 & 0xFF, 0xd1a0 & 0xFF}, + {0xd1a1 & 0xFF, 0xd1bb & 0xFF}, + {0xd1bc & 0xFF, 0xd1bc & 0xFF}, + {0xd1bd & 0xFF, 0xd1d7 & 0xFF}, + {0xd1d8 & 0xFF, 0xd1d8 & 0xFF}, + {0xd1d9 & 0xFF, 0xd1f3 & 0xFF}, + {0xd1f4 & 0xFF, 0xd1f4 & 0xFF}, + {0xd1f5 & 0xFF, 0xd1ff & 0xFF}, + {0xd200 & 0xFF, 0xd20f & 0xFF}, + {0xd210 & 0xFF, 0xd210 & 0xFF}, + {0xd211 & 0xFF, 0xd22b & 0xFF}, + {0xd22c & 0xFF, 0xd22c & 0xFF}, + {0xd22d & 0xFF, 0xd247 & 0xFF}, + {0xd248 & 0xFF, 0xd248 & 0xFF}, + {0xd249 & 0xFF, 0xd263 & 0xFF}, + {0xd264 & 0xFF, 0xd264 & 0xFF}, + {0xd265 & 0xFF, 0xd27f & 0xFF}, + {0xd280 & 0xFF, 0xd280 & 0xFF}, + {0xd281 & 0xFF, 0xd29b & 0xFF}, + {0xd29c & 0xFF, 0xd29c & 0xFF}, + {0xd29d & 0xFF, 0xd2b7 & 0xFF}, + {0xd2b8 & 0xFF, 0xd2b8 & 0xFF}, + {0xd2b9 & 0xFF, 0xd2d3 & 0xFF}, + {0xd2d4 & 0xFF, 0xd2d4 & 0xFF}, + {0xd2d5 & 0xFF, 0xd2ef & 0xFF}, + {0xd2f0 & 0xFF, 0xd2f0 & 0xFF}, + {0xd2f1 & 0xFF, 0xd2ff & 0xFF}, + {0xd300 & 0xFF, 0xd30b & 0xFF}, + {0xd30c & 0xFF, 0xd30c & 0xFF}, + {0xd30d & 0xFF, 0xd327 & 0xFF}, + {0xd328 & 0xFF, 0xd328 & 0xFF}, + {0xd329 & 0xFF, 0xd343 & 0xFF}, + {0xd344 & 0xFF, 0xd344 & 0xFF}, + {0xd345 & 0xFF, 0xd35f & 0xFF}, + {0xd360 & 0xFF, 0xd360 & 0xFF}, + {0xd361 & 0xFF, 0xd37b & 0xFF}, + {0xd37c & 0xFF, 0xd37c & 0xFF}, + {0xd37d & 0xFF, 0xd397 & 0xFF}, + {0xd398 & 0xFF, 0xd398 & 0xFF}, + {0xd399 & 0xFF, 0xd3b3 & 0xFF}, + {0xd3b4 & 0xFF, 0xd3b4 & 0xFF}, + {0xd3b5 & 0xFF, 0xd3cf & 0xFF}, + {0xd3d0 & 0xFF, 0xd3d0 & 0xFF}, + {0xd3d1 & 0xFF, 0xd3eb & 0xFF}, + {0xd3ec & 0xFF, 0xd3ec & 0xFF}, + {0xd3ed & 0xFF, 0xd3ff & 0xFF}, + {0xd400 & 0xFF, 0xd407 & 0xFF}, + {0xd408 & 0xFF, 0xd408 & 0xFF}, + {0xd409 & 0xFF, 0xd423 & 0xFF}, + {0xd424 & 0xFF, 0xd424 & 0xFF}, + {0xd425 & 0xFF, 0xd43f & 0xFF}, + {0xd440 & 0xFF, 0xd440 & 0xFF}, + {0xd441 & 0xFF, 0xd45b & 0xFF}, + {0xd45c & 0xFF, 0xd45c & 0xFF}, + {0xd45d & 0xFF, 0xd477 & 0xFF}, + {0xd478 & 0xFF, 0xd478 & 0xFF}, + {0xd479 & 0xFF, 0xd493 & 0xFF}, + {0xd494 & 0xFF, 0xd494 & 0xFF}, + {0xd495 & 0xFF, 0xd4af & 0xFF}, + {0xd4b0 & 0xFF, 0xd4b0 & 0xFF}, + {0xd4b1 & 0xFF, 0xd4cb & 0xFF}, + {0xd4cc & 0xFF, 0xd4cc & 0xFF}, + {0xd4cd & 0xFF, 0xd4e7 & 0xFF}, + {0xd4e8 & 0xFF, 0xd4e8 & 0xFF}, + {0xd4e9 & 0xFF, 0xd4ff & 0xFF}, + {0xd500 & 0xFF, 0xd503 & 0xFF}, + {0xd504 & 0xFF, 0xd504 & 0xFF}, + {0xd505 & 0xFF, 0xd51f & 0xFF}, + {0xd520 & 0xFF, 0xd520 & 0xFF}, + {0xd521 & 0xFF, 0xd53b & 0xFF}, + {0xd53c & 0xFF, 0xd53c & 0xFF}, + {0xd53d & 0xFF, 0xd557 & 0xFF}, + {0xd558 & 0xFF, 0xd558 & 0xFF}, + {0xd559 & 0xFF, 0xd573 & 0xFF}, + {0xd574 & 0xFF, 0xd574 & 0xFF}, + {0xd575 & 0xFF, 0xd58f & 0xFF}, + {0xd590 & 0xFF, 0xd590 & 0xFF}, + {0xd591 & 0xFF, 0xd5ab & 0xFF}, + {0xd5ac & 0xFF, 0xd5ac & 0xFF}, + {0xd5ad & 0xFF, 0xd5c7 & 0xFF}, + {0xd5c8 & 0xFF, 0xd5c8 & 0xFF}, + {0xd5c9 & 0xFF, 0xd5e3 & 0xFF}, + {0xd5e4 & 0xFF, 0xd5e4 & 0xFF}, + {0xd5e5 & 0xFF, 0xd5ff & 0xFF}, + {0xd600 & 0xFF, 0xd600 & 0xFF}, + {0xd601 & 0xFF, 0xd61b & 0xFF}, + {0xd61c & 0xFF, 0xd61c & 0xFF}, + {0xd61d & 0xFF, 0xd637 & 0xFF}, + {0xd638 & 0xFF, 0xd638 & 0xFF}, + {0xd639 & 0xFF, 0xd653 & 0xFF}, + {0xd654 & 0xFF, 0xd654 & 0xFF}, + {0xd655 & 0xFF, 0xd66f & 0xFF}, + {0xd670 & 0xFF, 0xd670 & 0xFF}, + {0xd671 & 0xFF, 0xd68b & 0xFF}, + {0xd68c & 0xFF, 0xd68c & 0xFF}, + {0xd68d & 0xFF, 0xd6a7 & 0xFF}, + {0xd6a8 & 0xFF, 0xd6a8 & 0xFF}, + {0xd6a9 & 0xFF, 0xd6c3 & 0xFF}, + {0xd6c4 & 0xFF, 0xd6c4 & 0xFF}, + {0xd6c5 & 0xFF, 0xd6df & 0xFF}, + {0xd6e0 & 0xFF, 0xd6e0 & 0xFF}, + {0xd6e1 & 0xFF, 0xd6fb & 0xFF}, + {0xd6fc & 0xFF, 0xd6fc & 0xFF}, + {0xd6fd & 0xFF, 0xd6ff & 0xFF}, + {0xd700 & 0xFF, 0xd717 & 0xFF}, + {0xd718 & 0xFF, 0xd718 & 0xFF}, + {0xd719 & 0xFF, 0xd733 & 0xFF}, + {0xd734 & 0xFF, 0xd734 & 0xFF}, + {0xd735 & 0xFF, 0xd74f & 0xFF}, + {0xd750 & 0xFF, 0xd750 & 0xFF}, + {0xd751 & 0xFF, 0xd76b & 0xFF}, + {0xd76c & 0xFF, 0xd76c & 0xFF}, + {0xd76d & 0xFF, 0xd787 & 0xFF}, + {0xd788 & 0xFF, 0xd788 & 0xFF}, + {0xd789 & 0xFF, 0xd7a3 & 0xFF}, + {0xd7b0 & 0xFF, 0xd7c6 & 0xFF}, + {0xd7cb & 0xFF, 0xd7fb & 0xFF}, + {0xd800 & 0xFF, 0xd8ff & 0xFF}, + {0xd900 & 0xFF, 0xd9ff & 0xFF}, + {0xda00 & 0xFF, 0xdaff & 0xFF}, + {0xdb00 & 0xFF, 0xdbff & 0xFF}, + {0xdc00 & 0xFF, 0xdcff & 0xFF}, + {0xdd00 & 0xFF, 0xddff & 0xFF}, + {0xde00 & 0xFF, 0xdeff & 0xFF}, + {0xdf00 & 0xFF, 0xdfff & 0xFF}, + {0xf900 & 0xFF, 0xf9ff & 0xFF}, + {0xfa00 & 0xFF, 0xfaff & 0xFF}, + {0xfb00 & 0xFF, 0xfb06 & 0xFF}, + {0xfb13 & 0xFF, 0xfb17 & 0xFF}, + {0xfb1d & 0xFF, 0xfb1d & 0xFF}, + {0xfb1e & 0xFF, 0xfb1e & 0xFF}, + {0xfb1f & 0xFF, 0xfb36 & 0xFF}, + {0xfb38 & 0xFF, 0xfb3c & 0xFF}, + {0xfb3e & 0xFF, 0xfb3e & 0xFF}, + {0xfb40 & 0xFF, 0xfb41 & 0xFF}, + {0xfb43 & 0xFF, 0xfb44 & 0xFF}, + {0xfb46 & 0xFF, 0xfbc1 & 0xFF}, + {0xfbd3 & 0xFF, 0xfbff & 0xFF}, + {0xfc00 & 0xFF, 0xfcff & 0xFF}, + {0xfd00 & 0xFF, 0xfd3d & 0xFF}, + {0xfd3e & 0xFF, 0xfd3e & 0xFF}, + {0xfd3f & 0xFF, 0xfd3f & 0xFF}, + {0xfd50 & 0xFF, 0xfd8f & 0xFF}, + {0xfd92 & 0xFF, 0xfdc7 & 0xFF}, + {0xfdf0 & 0xFF, 0xfdfb & 0xFF}, + {0xfdfc & 0xFF, 0xfdfc & 0xFF}, + {0xfdfd & 0xFF, 0xfdfd & 0xFF}, + {0xfe00 & 0xFF, 0xfe0f & 0xFF}, + {0xfe10 & 0xFF, 0xfe10 & 0xFF}, + {0xfe11 & 0xFF, 0xfe12 & 0xFF}, + {0xfe13 & 0xFF, 0xfe14 & 0xFF}, + {0xfe15 & 0xFF, 0xfe16 & 0xFF}, + {0xfe17 & 0xFF, 0xfe17 & 0xFF}, + {0xfe18 & 0xFF, 0xfe18 & 0xFF}, + {0xfe19 & 0xFF, 0xfe19 & 0xFF}, + {0xfe20 & 0xFF, 0xfe26 & 0xFF}, + {0xfe30 & 0xFF, 0xfe34 & 0xFF}, + {0xfe35 & 0xFF, 0xfe35 & 0xFF}, + {0xfe36 & 0xFF, 0xfe36 & 0xFF}, + {0xfe37 & 0xFF, 0xfe37 & 0xFF}, + {0xfe38 & 0xFF, 0xfe38 & 0xFF}, + {0xfe39 & 0xFF, 0xfe39 & 0xFF}, + {0xfe3a & 0xFF, 0xfe3a & 0xFF}, + {0xfe3b & 0xFF, 0xfe3b & 0xFF}, + {0xfe3c & 0xFF, 0xfe3c & 0xFF}, + {0xfe3d & 0xFF, 0xfe3d & 0xFF}, + {0xfe3e & 0xFF, 0xfe3e & 0xFF}, + {0xfe3f & 0xFF, 0xfe3f & 0xFF}, + {0xfe40 & 0xFF, 0xfe40 & 0xFF}, + {0xfe41 & 0xFF, 0xfe41 & 0xFF}, + {0xfe42 & 0xFF, 0xfe42 & 0xFF}, + {0xfe43 & 0xFF, 0xfe43 & 0xFF}, + {0xfe44 & 0xFF, 0xfe44 & 0xFF}, + {0xfe45 & 0xFF, 0xfe46 & 0xFF}, + {0xfe47 & 0xFF, 0xfe47 & 0xFF}, + {0xfe48 & 0xFF, 0xfe48 & 0xFF}, + {0xfe49 & 0xFF, 0xfe4f & 0xFF}, + {0xfe50 & 0xFF, 0xfe50 & 0xFF}, + {0xfe51 & 0xFF, 0xfe51 & 0xFF}, + {0xfe52 & 0xFF, 0xfe52 & 0xFF}, + {0xfe54 & 0xFF, 0xfe55 & 0xFF}, + {0xfe56 & 0xFF, 0xfe57 & 0xFF}, + {0xfe58 & 0xFF, 0xfe58 & 0xFF}, + {0xfe59 & 0xFF, 0xfe59 & 0xFF}, + {0xfe5a & 0xFF, 0xfe5a & 0xFF}, + {0xfe5b & 0xFF, 0xfe5b & 0xFF}, + {0xfe5c & 0xFF, 0xfe5c & 0xFF}, + {0xfe5d & 0xFF, 0xfe5d & 0xFF}, + {0xfe5e & 0xFF, 0xfe5e & 0xFF}, + {0xfe5f & 0xFF, 0xfe66 & 0xFF}, + {0xfe68 & 0xFF, 0xfe68 & 0xFF}, + {0xfe69 & 0xFF, 0xfe69 & 0xFF}, + {0xfe6a & 0xFF, 0xfe6a & 0xFF}, + {0xfe6b & 0xFF, 0xfe6b & 0xFF}, + {0xfe70 & 0xFF, 0xfe74 & 0xFF}, + {0xfe76 & 0xFF, 0xfefc & 0xFF}, + {0xfeff & 0xFF, 0xfeff & 0xFF}, + {0xff01 & 0xFF, 0xff01 & 0xFF}, + {0xff02 & 0xFF, 0xff03 & 0xFF}, + {0xff04 & 0xFF, 0xff04 & 0xFF}, + {0xff05 & 0xFF, 0xff05 & 0xFF}, + {0xff06 & 0xFF, 0xff07 & 0xFF}, + {0xff08 & 0xFF, 0xff08 & 0xFF}, + {0xff09 & 0xFF, 0xff09 & 0xFF}, + {0xff0a & 0xFF, 0xff0b & 0xFF}, + {0xff0c & 0xFF, 0xff0c & 0xFF}, + {0xff0d & 0xFF, 0xff0d & 0xFF}, + {0xff0e & 0xFF, 0xff0e & 0xFF}, + {0xff0f & 0xFF, 0xff19 & 0xFF}, + {0xff1a & 0xFF, 0xff1b & 0xFF}, + {0xff1c & 0xFF, 0xff1e & 0xFF}, + {0xff1f & 0xFF, 0xff1f & 0xFF}, + {0xff20 & 0xFF, 0xff3a & 0xFF}, + {0xff3b & 0xFF, 0xff3b & 0xFF}, + {0xff3c & 0xFF, 0xff3c & 0xFF}, + {0xff3d & 0xFF, 0xff3d & 0xFF}, + {0xff3e & 0xFF, 0xff5a & 0xFF}, + {0xff5b & 0xFF, 0xff5b & 0xFF}, + {0xff5c & 0xFF, 0xff5c & 0xFF}, + {0xff5d & 0xFF, 0xff5d & 0xFF}, + {0xff5e & 0xFF, 0xff5e & 0xFF}, + {0xff5f & 0xFF, 0xff5f & 0xFF}, + {0xff60 & 0xFF, 0xff61 & 0xFF}, + {0xff62 & 0xFF, 0xff62 & 0xFF}, + {0xff63 & 0xFF, 0xff64 & 0xFF}, + {0xff65 & 0xFF, 0xff65 & 0xFF}, + {0xff66 & 0xFF, 0xff66 & 0xFF}, + {0xff67 & 0xFF, 0xff70 & 0xFF}, + {0xff71 & 0xFF, 0xff9d & 0xFF}, + {0xff9e & 0xFF, 0xff9f & 0xFF}, + {0xffa0 & 0xFF, 0xffbe & 0xFF}, + {0xffc2 & 0xFF, 0xffc7 & 0xFF}, + {0xffca & 0xFF, 0xffcf & 0xFF}, + {0xffd2 & 0xFF, 0xffd7 & 0xFF}, + {0xffda & 0xFF, 0xffdc & 0xFF}, + {0xffe0 & 0xFF, 0xffe0 & 0xFF}, + {0xffe1 & 0xFF, 0xffe1 & 0xFF}, + {0xffe2 & 0xFF, 0xffe4 & 0xFF}, + {0xffe5 & 0xFF, 0xffe6 & 0xFF}, + {0xffe8 & 0xFF, 0xffee & 0xFF}, + {0xfff9 & 0xFF, 0xfffb & 0xFF}, + {0xfffc & 0xFF, 0xfffc & 0xFF}, + {0xfffd & 0xFF, 0xfffd & 0xFF}, + {0x10000 & 0xFF, 0x1000b & 0xFF}, + {0x1000d & 0xFF, 0x10026 & 0xFF}, + {0x10028 & 0xFF, 0x1003a & 0xFF}, + {0x1003c & 0xFF, 0x1003d & 0xFF}, + {0x1003f & 0xFF, 0x1004d & 0xFF}, + {0x10050 & 0xFF, 0x1005d & 0xFF}, + {0x10080 & 0xFF, 0x100fa & 0xFF}, + {0x10100 & 0xFF, 0x10102 & 0xFF}, + {0x10107 & 0xFF, 0x10133 & 0xFF}, + {0x10137 & 0xFF, 0x1018a & 0xFF}, + {0x10190 & 0xFF, 0x1019b & 0xFF}, + {0x101d0 & 0xFF, 0x101fc & 0xFF}, + {0x101fd & 0xFF, 0x101fd & 0xFF}, + {0x10280 & 0xFF, 0x1029c & 0xFF}, + {0x102a0 & 0xFF, 0x102d0 & 0xFF}, + {0x10300 & 0xFF, 0x1031e & 0xFF}, + {0x10320 & 0xFF, 0x10323 & 0xFF}, + {0x10330 & 0xFF, 0x1034a & 0xFF}, + {0x10380 & 0xFF, 0x1039d & 0xFF}, + {0x1039f & 0xFF, 0x1039f & 0xFF}, + {0x103a0 & 0xFF, 0x103c3 & 0xFF}, + {0x103c8 & 0xFF, 0x103cf & 0xFF}, + {0x103d0 & 0xFF, 0x103d0 & 0xFF}, + {0x103d1 & 0xFF, 0x103d5 & 0xFF}, + {0x10400 & 0xFF, 0x1049d & 0xFF}, + {0x104a0 & 0xFF, 0x104a9 & 0xFF}, + {0x10800 & 0xFF, 0x10805 & 0xFF}, + {0x10808 & 0xFF, 0x10808 & 0xFF}, + {0x1080a & 0xFF, 0x10835 & 0xFF}, + {0x10837 & 0xFF, 0x10838 & 0xFF}, + {0x1083c & 0xFF, 0x1083c & 0xFF}, + {0x1083f & 0xFF, 0x10855 & 0xFF}, + {0x10857 & 0xFF, 0x10857 & 0xFF}, + {0x10858 & 0xFF, 0x1085f & 0xFF}, + {0x10900 & 0xFF, 0x1091b & 0xFF}, + {0x1091f & 0xFF, 0x1091f & 0xFF}, + {0x10920 & 0xFF, 0x10939 & 0xFF}, + {0x1093f & 0xFF, 0x1093f & 0xFF}, + {0x10a00 & 0xFF, 0x10a00 & 0xFF}, + {0x10a01 & 0xFF, 0x10a03 & 0xFF}, + {0x10a05 & 0xFF, 0x10a06 & 0xFF}, + {0x10a0c & 0xFF, 0x10a0f & 0xFF}, + {0x10a10 & 0xFF, 0x10a13 & 0xFF}, + {0x10a15 & 0xFF, 0x10a17 & 0xFF}, + {0x10a19 & 0xFF, 0x10a33 & 0xFF}, + {0x10a38 & 0xFF, 0x10a3a & 0xFF}, + {0x10a3f & 0xFF, 0x10a3f & 0xFF}, + {0x10a40 & 0xFF, 0x10a47 & 0xFF}, + {0x10a50 & 0xFF, 0x10a57 & 0xFF}, + {0x10a58 & 0xFF, 0x10a58 & 0xFF}, + {0x10a60 & 0xFF, 0x10a7f & 0xFF}, + {0x10b00 & 0xFF, 0x10b35 & 0xFF}, + {0x10b39 & 0xFF, 0x10b3f & 0xFF}, + {0x10b40 & 0xFF, 0x10b55 & 0xFF}, + {0x10b58 & 0xFF, 0x10b72 & 0xFF}, + {0x10b78 & 0xFF, 0x10b7f & 0xFF}, + {0x10c00 & 0xFF, 0x10c48 & 0xFF}, + {0x10e60 & 0xFF, 0x10e7e & 0xFF}, + {0x11000 & 0xFF, 0x11002 & 0xFF}, + {0x11003 & 0xFF, 0x11037 & 0xFF}, + {0x11038 & 0xFF, 0x11046 & 0xFF}, + {0x11047 & 0xFF, 0x11048 & 0xFF}, + {0x11049 & 0xFF, 0x1104d & 0xFF}, + {0x11052 & 0xFF, 0x11065 & 0xFF}, + {0x11066 & 0xFF, 0x1106f & 0xFF}, + {0x11080 & 0xFF, 0x11082 & 0xFF}, + {0x11083 & 0xFF, 0x110af & 0xFF}, + {0x110b0 & 0xFF, 0x110ba & 0xFF}, + {0x110bb & 0xFF, 0x110bd & 0xFF}, + {0x110be & 0xFF, 0x110c1 & 0xFF}, + {0x12000 & 0xFF, 0x120ff & 0xFF}, + {0x12100 & 0xFF, 0x121ff & 0xFF}, + {0x12200 & 0xFF, 0x122ff & 0xFF}, + {0x12300 & 0xFF, 0x1236e & 0xFF}, + {0x12400 & 0xFF, 0x12462 & 0xFF}, + {0x12470 & 0xFF, 0x12473 & 0xFF}, + {0x13000 & 0xFF, 0x130ff & 0xFF}, + {0x13100 & 0xFF, 0x131ff & 0xFF}, + {0x13200 & 0xFF, 0x13257 & 0xFF}, + {0x13258 & 0xFF, 0x1325a & 0xFF}, + {0x1325b & 0xFF, 0x1325d & 0xFF}, + {0x1325e & 0xFF, 0x13281 & 0xFF}, + {0x13282 & 0xFF, 0x13282 & 0xFF}, + {0x13283 & 0xFF, 0x13285 & 0xFF}, + {0x13286 & 0xFF, 0x13286 & 0xFF}, + {0x13287 & 0xFF, 0x13287 & 0xFF}, + {0x13288 & 0xFF, 0x13288 & 0xFF}, + {0x13289 & 0xFF, 0x13289 & 0xFF}, + {0x1328a & 0xFF, 0x132ff & 0xFF}, + {0x13300 & 0xFF, 0x13378 & 0xFF}, + {0x13379 & 0xFF, 0x13379 & 0xFF}, + {0x1337a & 0xFF, 0x1337b & 0xFF}, + {0x1337c & 0xFF, 0x133ff & 0xFF}, + {0x13400 & 0xFF, 0x1342e & 0xFF}, + {0x16800 & 0xFF, 0x168ff & 0xFF}, + {0x16900 & 0xFF, 0x169ff & 0xFF}, + {0x16a00 & 0xFF, 0x16a38 & 0xFF}, + {0x1b000 & 0xFF, 0x1b001 & 0xFF}, + {0x1d000 & 0xFF, 0x1d0f5 & 0xFF}, + {0x1d100 & 0xFF, 0x1d126 & 0xFF}, + {0x1d129 & 0xFF, 0x1d164 & 0xFF}, + {0x1d165 & 0xFF, 0x1d169 & 0xFF}, + {0x1d16a & 0xFF, 0x1d16c & 0xFF}, + {0x1d16d & 0xFF, 0x1d182 & 0xFF}, + {0x1d183 & 0xFF, 0x1d184 & 0xFF}, + {0x1d185 & 0xFF, 0x1d18b & 0xFF}, + {0x1d18c & 0xFF, 0x1d1a9 & 0xFF}, + {0x1d1aa & 0xFF, 0x1d1ad & 0xFF}, + {0x1d1ae & 0xFF, 0x1d1dd & 0xFF}, + {0x1d200 & 0xFF, 0x1d241 & 0xFF}, + {0x1d242 & 0xFF, 0x1d244 & 0xFF}, + {0x1d245 & 0xFF, 0x1d245 & 0xFF}, + {0x1d300 & 0xFF, 0x1d356 & 0xFF}, + {0x1d360 & 0xFF, 0x1d371 & 0xFF}, + {0x1d400 & 0xFF, 0x1d454 & 0xFF}, + {0x1d456 & 0xFF, 0x1d49c & 0xFF}, + {0x1d49e & 0xFF, 0x1d49f & 0xFF}, + {0x1d4a2 & 0xFF, 0x1d4a2 & 0xFF}, + {0x1d4a5 & 0xFF, 0x1d4a6 & 0xFF}, + {0x1d4a9 & 0xFF, 0x1d4ac & 0xFF}, + {0x1d4ae & 0xFF, 0x1d4b9 & 0xFF}, + {0x1d4bb & 0xFF, 0x1d4bb & 0xFF}, + {0x1d4bd & 0xFF, 0x1d4c3 & 0xFF}, + {0x1d4c5 & 0xFF, 0x1d4ff & 0xFF}, + {0x1d500 & 0xFF, 0x1d505 & 0xFF}, + {0x1d507 & 0xFF, 0x1d50a & 0xFF}, + {0x1d50d & 0xFF, 0x1d514 & 0xFF}, + {0x1d516 & 0xFF, 0x1d51c & 0xFF}, + {0x1d51e & 0xFF, 0x1d539 & 0xFF}, + {0x1d53b & 0xFF, 0x1d53e & 0xFF}, + {0x1d540 & 0xFF, 0x1d544 & 0xFF}, + {0x1d546 & 0xFF, 0x1d546 & 0xFF}, + {0x1d54a & 0xFF, 0x1d550 & 0xFF}, + {0x1d552 & 0xFF, 0x1d5ff & 0xFF}, + {0x1d600 & 0xFF, 0x1d6a5 & 0xFF}, + {0x1d6a8 & 0xFF, 0x1d6ff & 0xFF}, + {0x1d700 & 0xFF, 0x1d7cb & 0xFF}, + {0x1d7ce & 0xFF, 0x1d7ff & 0xFF}, + {0x1f000 & 0xFF, 0x1f02b & 0xFF}, + {0x1f030 & 0xFF, 0x1f093 & 0xFF}, + {0x1f0a0 & 0xFF, 0x1f0ae & 0xFF}, + {0x1f0b1 & 0xFF, 0x1f0be & 0xFF}, + {0x1f0c1 & 0xFF, 0x1f0cf & 0xFF}, + {0x1f0d1 & 0xFF, 0x1f0df & 0xFF}, + {0x1f100 & 0xFF, 0x1f10a & 0xFF}, + {0x1f110 & 0xFF, 0x1f12e & 0xFF}, + {0x1f130 & 0xFF, 0x1f169 & 0xFF}, + {0x1f170 & 0xFF, 0x1f19a & 0xFF}, + {0x1f1e6 & 0xFF, 0x1f1ff & 0xFF}, + {0x1f200 & 0xFF, 0x1f202 & 0xFF}, + {0x1f210 & 0xFF, 0x1f23a & 0xFF}, + {0x1f240 & 0xFF, 0x1f248 & 0xFF}, + {0x1f250 & 0xFF, 0x1f251 & 0xFF}, + {0x1f300 & 0xFF, 0x1f320 & 0xFF}, + {0x1f330 & 0xFF, 0x1f335 & 0xFF}, + {0x1f337 & 0xFF, 0x1f37c & 0xFF}, + {0x1f380 & 0xFF, 0x1f393 & 0xFF}, + {0x1f3a0 & 0xFF, 0x1f3c4 & 0xFF}, + {0x1f3c6 & 0xFF, 0x1f3ca & 0xFF}, + {0x1f3e0 & 0xFF, 0x1f3f0 & 0xFF}, + {0x1f400 & 0xFF, 0x1f43e & 0xFF}, + {0x1f440 & 0xFF, 0x1f440 & 0xFF}, + {0x1f442 & 0xFF, 0x1f4f7 & 0xFF}, + {0x1f4f9 & 0xFF, 0x1f4fc & 0xFF}, + {0x1f500 & 0xFF, 0x1f53d & 0xFF}, + {0x1f550 & 0xFF, 0x1f567 & 0xFF}, + {0x1f5fb & 0xFF, 0x1f5ff & 0xFF}, + {0x1f601 & 0xFF, 0x1f610 & 0xFF}, + {0x1f612 & 0xFF, 0x1f614 & 0xFF}, + {0x1f616 & 0xFF, 0x1f616 & 0xFF}, + {0x1f618 & 0xFF, 0x1f618 & 0xFF}, + {0x1f61a & 0xFF, 0x1f61a & 0xFF}, + {0x1f61c & 0xFF, 0x1f61e & 0xFF}, + {0x1f620 & 0xFF, 0x1f625 & 0xFF}, + {0x1f628 & 0xFF, 0x1f62b & 0xFF}, + {0x1f62d & 0xFF, 0x1f62d & 0xFF}, + {0x1f630 & 0xFF, 0x1f633 & 0xFF}, + {0x1f635 & 0xFF, 0x1f640 & 0xFF}, + {0x1f645 & 0xFF, 0x1f64f & 0xFF}, + {0x1f680 & 0xFF, 0x1f6c5 & 0xFF}, + {0x1f700 & 0xFF, 0x1f773 & 0xFF}, + {0x20000 & 0xFF, 0x200ff & 0xFF}, + {0x20100 & 0xFF, 0x201ff & 0xFF}, + {0x20200 & 0xFF, 0x202ff & 0xFF}, + {0x20300 & 0xFF, 0x203ff & 0xFF}, + {0x20400 & 0xFF, 0x204ff & 0xFF}, + {0x20500 & 0xFF, 0x205ff & 0xFF}, + {0x20600 & 0xFF, 0x206ff & 0xFF}, + {0x20700 & 0xFF, 0x207ff & 0xFF}, + {0x20800 & 0xFF, 0x208ff & 0xFF}, + {0x20900 & 0xFF, 0x209ff & 0xFF}, + {0x20a00 & 0xFF, 0x20aff & 0xFF}, + {0x20b00 & 0xFF, 0x20bff & 0xFF}, + {0x20c00 & 0xFF, 0x20cff & 0xFF}, + {0x20d00 & 0xFF, 0x20dff & 0xFF}, + {0x20e00 & 0xFF, 0x20eff & 0xFF}, + {0x20f00 & 0xFF, 0x20fff & 0xFF}, + {0x21000 & 0xFF, 0x210ff & 0xFF}, + {0x21100 & 0xFF, 0x211ff & 0xFF}, + {0x21200 & 0xFF, 0x212ff & 0xFF}, + {0x21300 & 0xFF, 0x213ff & 0xFF}, + {0x21400 & 0xFF, 0x214ff & 0xFF}, + {0x21500 & 0xFF, 0x215ff & 0xFF}, + {0x21600 & 0xFF, 0x216ff & 0xFF}, + {0x21700 & 0xFF, 0x217ff & 0xFF}, + {0x21800 & 0xFF, 0x218ff & 0xFF}, + {0x21900 & 0xFF, 0x219ff & 0xFF}, + {0x21a00 & 0xFF, 0x21aff & 0xFF}, + {0x21b00 & 0xFF, 0x21bff & 0xFF}, + {0x21c00 & 0xFF, 0x21cff & 0xFF}, + {0x21d00 & 0xFF, 0x21dff & 0xFF}, + {0x21e00 & 0xFF, 0x21eff & 0xFF}, + {0x21f00 & 0xFF, 0x21fff & 0xFF}, + {0x22000 & 0xFF, 0x220ff & 0xFF}, + {0x22100 & 0xFF, 0x221ff & 0xFF}, + {0x22200 & 0xFF, 0x222ff & 0xFF}, + {0x22300 & 0xFF, 0x223ff & 0xFF}, + {0x22400 & 0xFF, 0x224ff & 0xFF}, + {0x22500 & 0xFF, 0x225ff & 0xFF}, + {0x22600 & 0xFF, 0x226ff & 0xFF}, + {0x22700 & 0xFF, 0x227ff & 0xFF}, + {0x22800 & 0xFF, 0x228ff & 0xFF}, + {0x22900 & 0xFF, 0x229ff & 0xFF}, + {0x22a00 & 0xFF, 0x22aff & 0xFF}, + {0x22b00 & 0xFF, 0x22bff & 0xFF}, + {0x22c00 & 0xFF, 0x22cff & 0xFF}, + {0x22d00 & 0xFF, 0x22dff & 0xFF}, + {0x22e00 & 0xFF, 0x22eff & 0xFF}, + {0x22f00 & 0xFF, 0x22fff & 0xFF}, + {0x23000 & 0xFF, 0x230ff & 0xFF}, + {0x23100 & 0xFF, 0x231ff & 0xFF}, + {0x23200 & 0xFF, 0x232ff & 0xFF}, + {0x23300 & 0xFF, 0x233ff & 0xFF}, + {0x23400 & 0xFF, 0x234ff & 0xFF}, + {0x23500 & 0xFF, 0x235ff & 0xFF}, + {0x23600 & 0xFF, 0x236ff & 0xFF}, + {0x23700 & 0xFF, 0x237ff & 0xFF}, + {0x23800 & 0xFF, 0x238ff & 0xFF}, + {0x23900 & 0xFF, 0x239ff & 0xFF}, + {0x23a00 & 0xFF, 0x23aff & 0xFF}, + {0x23b00 & 0xFF, 0x23bff & 0xFF}, + {0x23c00 & 0xFF, 0x23cff & 0xFF}, + {0x23d00 & 0xFF, 0x23dff & 0xFF}, + {0x23e00 & 0xFF, 0x23eff & 0xFF}, + {0x23f00 & 0xFF, 0x23fff & 0xFF}, + {0x24000 & 0xFF, 0x240ff & 0xFF}, + {0x24100 & 0xFF, 0x241ff & 0xFF}, + {0x24200 & 0xFF, 0x242ff & 0xFF}, + {0x24300 & 0xFF, 0x243ff & 0xFF}, + {0x24400 & 0xFF, 0x244ff & 0xFF}, + {0x24500 & 0xFF, 0x245ff & 0xFF}, + {0x24600 & 0xFF, 0x246ff & 0xFF}, + {0x24700 & 0xFF, 0x247ff & 0xFF}, + {0x24800 & 0xFF, 0x248ff & 0xFF}, + {0x24900 & 0xFF, 0x249ff & 0xFF}, + {0x24a00 & 0xFF, 0x24aff & 0xFF}, + {0x24b00 & 0xFF, 0x24bff & 0xFF}, + {0x24c00 & 0xFF, 0x24cff & 0xFF}, + {0x24d00 & 0xFF, 0x24dff & 0xFF}, + {0x24e00 & 0xFF, 0x24eff & 0xFF}, + {0x24f00 & 0xFF, 0x24fff & 0xFF}, + {0x25000 & 0xFF, 0x250ff & 0xFF}, + {0x25100 & 0xFF, 0x251ff & 0xFF}, + {0x25200 & 0xFF, 0x252ff & 0xFF}, + {0x25300 & 0xFF, 0x253ff & 0xFF}, + {0x25400 & 0xFF, 0x254ff & 0xFF}, + {0x25500 & 0xFF, 0x255ff & 0xFF}, + {0x25600 & 0xFF, 0x256ff & 0xFF}, + {0x25700 & 0xFF, 0x257ff & 0xFF}, + {0x25800 & 0xFF, 0x258ff & 0xFF}, + {0x25900 & 0xFF, 0x259ff & 0xFF}, + {0x25a00 & 0xFF, 0x25aff & 0xFF}, + {0x25b00 & 0xFF, 0x25bff & 0xFF}, + {0x25c00 & 0xFF, 0x25cff & 0xFF}, + {0x25d00 & 0xFF, 0x25dff & 0xFF}, + {0x25e00 & 0xFF, 0x25eff & 0xFF}, + {0x25f00 & 0xFF, 0x25fff & 0xFF}, + {0x26000 & 0xFF, 0x260ff & 0xFF}, + {0x26100 & 0xFF, 0x261ff & 0xFF}, + {0x26200 & 0xFF, 0x262ff & 0xFF}, + {0x26300 & 0xFF, 0x263ff & 0xFF}, + {0x26400 & 0xFF, 0x264ff & 0xFF}, + {0x26500 & 0xFF, 0x265ff & 0xFF}, + {0x26600 & 0xFF, 0x266ff & 0xFF}, + {0x26700 & 0xFF, 0x267ff & 0xFF}, + {0x26800 & 0xFF, 0x268ff & 0xFF}, + {0x26900 & 0xFF, 0x269ff & 0xFF}, + {0x26a00 & 0xFF, 0x26aff & 0xFF}, + {0x26b00 & 0xFF, 0x26bff & 0xFF}, + {0x26c00 & 0xFF, 0x26cff & 0xFF}, + {0x26d00 & 0xFF, 0x26dff & 0xFF}, + {0x26e00 & 0xFF, 0x26eff & 0xFF}, + {0x26f00 & 0xFF, 0x26fff & 0xFF}, + {0x27000 & 0xFF, 0x270ff & 0xFF}, + {0x27100 & 0xFF, 0x271ff & 0xFF}, + {0x27200 & 0xFF, 0x272ff & 0xFF}, + {0x27300 & 0xFF, 0x273ff & 0xFF}, + {0x27400 & 0xFF, 0x274ff & 0xFF}, + {0x27500 & 0xFF, 0x275ff & 0xFF}, + {0x27600 & 0xFF, 0x276ff & 0xFF}, + {0x27700 & 0xFF, 0x277ff & 0xFF}, + {0x27800 & 0xFF, 0x278ff & 0xFF}, + {0x27900 & 0xFF, 0x279ff & 0xFF}, + {0x27a00 & 0xFF, 0x27aff & 0xFF}, + {0x27b00 & 0xFF, 0x27bff & 0xFF}, + {0x27c00 & 0xFF, 0x27cff & 0xFF}, + {0x27d00 & 0xFF, 0x27dff & 0xFF}, + {0x27e00 & 0xFF, 0x27eff & 0xFF}, + {0x27f00 & 0xFF, 0x27fff & 0xFF}, + {0x28000 & 0xFF, 0x280ff & 0xFF}, + {0x28100 & 0xFF, 0x281ff & 0xFF}, + {0x28200 & 0xFF, 0x282ff & 0xFF}, + {0x28300 & 0xFF, 0x283ff & 0xFF}, + {0x28400 & 0xFF, 0x284ff & 0xFF}, + {0x28500 & 0xFF, 0x285ff & 0xFF}, + {0x28600 & 0xFF, 0x286ff & 0xFF}, + {0x28700 & 0xFF, 0x287ff & 0xFF}, + {0x28800 & 0xFF, 0x288ff & 0xFF}, + {0x28900 & 0xFF, 0x289ff & 0xFF}, + {0x28a00 & 0xFF, 0x28aff & 0xFF}, + {0x28b00 & 0xFF, 0x28bff & 0xFF}, + {0x28c00 & 0xFF, 0x28cff & 0xFF}, + {0x28d00 & 0xFF, 0x28dff & 0xFF}, + {0x28e00 & 0xFF, 0x28eff & 0xFF}, + {0x28f00 & 0xFF, 0x28fff & 0xFF}, + {0x29000 & 0xFF, 0x290ff & 0xFF}, + {0x29100 & 0xFF, 0x291ff & 0xFF}, + {0x29200 & 0xFF, 0x292ff & 0xFF}, + {0x29300 & 0xFF, 0x293ff & 0xFF}, + {0x29400 & 0xFF, 0x294ff & 0xFF}, + {0x29500 & 0xFF, 0x295ff & 0xFF}, + {0x29600 & 0xFF, 0x296ff & 0xFF}, + {0x29700 & 0xFF, 0x297ff & 0xFF}, + {0x29800 & 0xFF, 0x298ff & 0xFF}, + {0x29900 & 0xFF, 0x299ff & 0xFF}, + {0x29a00 & 0xFF, 0x29aff & 0xFF}, + {0x29b00 & 0xFF, 0x29bff & 0xFF}, + {0x29c00 & 0xFF, 0x29cff & 0xFF}, + {0x29d00 & 0xFF, 0x29dff & 0xFF}, + {0x29e00 & 0xFF, 0x29eff & 0xFF}, + {0x29f00 & 0xFF, 0x29fff & 0xFF}, + {0x2a000 & 0xFF, 0x2a0ff & 0xFF}, + {0x2a100 & 0xFF, 0x2a1ff & 0xFF}, + {0x2a200 & 0xFF, 0x2a2ff & 0xFF}, + {0x2a300 & 0xFF, 0x2a3ff & 0xFF}, + {0x2a400 & 0xFF, 0x2a4ff & 0xFF}, + {0x2a500 & 0xFF, 0x2a5ff & 0xFF}, + {0x2a600 & 0xFF, 0x2a6ff & 0xFF}, + {0x2a700 & 0xFF, 0x2a7ff & 0xFF}, + {0x2a800 & 0xFF, 0x2a8ff & 0xFF}, + {0x2a900 & 0xFF, 0x2a9ff & 0xFF}, + {0x2aa00 & 0xFF, 0x2aaff & 0xFF}, + {0x2ab00 & 0xFF, 0x2abff & 0xFF}, + {0x2ac00 & 0xFF, 0x2acff & 0xFF}, + {0x2ad00 & 0xFF, 0x2adff & 0xFF}, + {0x2ae00 & 0xFF, 0x2aeff & 0xFF}, + {0x2af00 & 0xFF, 0x2afff & 0xFF}, + {0x2b000 & 0xFF, 0x2b0ff & 0xFF}, + {0x2b100 & 0xFF, 0x2b1ff & 0xFF}, + {0x2b200 & 0xFF, 0x2b2ff & 0xFF}, + {0x2b300 & 0xFF, 0x2b3ff & 0xFF}, + {0x2b400 & 0xFF, 0x2b4ff & 0xFF}, + {0x2b500 & 0xFF, 0x2b5ff & 0xFF}, + {0x2b600 & 0xFF, 0x2b6ff & 0xFF}, + {0x2b700 & 0xFF, 0x2b7ff & 0xFF}, + {0x2b800 & 0xFF, 0x2b8ff & 0xFF}, + {0x2b900 & 0xFF, 0x2b9ff & 0xFF}, + {0x2ba00 & 0xFF, 0x2baff & 0xFF}, + {0x2bb00 & 0xFF, 0x2bbff & 0xFF}, + {0x2bc00 & 0xFF, 0x2bcff & 0xFF}, + {0x2bd00 & 0xFF, 0x2bdff & 0xFF}, + {0x2be00 & 0xFF, 0x2beff & 0xFF}, + {0x2bf00 & 0xFF, 0x2bfff & 0xFF}, + {0x2c000 & 0xFF, 0x2c0ff & 0xFF}, + {0x2c100 & 0xFF, 0x2c1ff & 0xFF}, + {0x2c200 & 0xFF, 0x2c2ff & 0xFF}, + {0x2c300 & 0xFF, 0x2c3ff & 0xFF}, + {0x2c400 & 0xFF, 0x2c4ff & 0xFF}, + {0x2c500 & 0xFF, 0x2c5ff & 0xFF}, + {0x2c600 & 0xFF, 0x2c6ff & 0xFF}, + {0x2c700 & 0xFF, 0x2c7ff & 0xFF}, + {0x2c800 & 0xFF, 0x2c8ff & 0xFF}, + {0x2c900 & 0xFF, 0x2c9ff & 0xFF}, + {0x2ca00 & 0xFF, 0x2caff & 0xFF}, + {0x2cb00 & 0xFF, 0x2cbff & 0xFF}, + {0x2cc00 & 0xFF, 0x2ccff & 0xFF}, + {0x2cd00 & 0xFF, 0x2cdff & 0xFF}, + {0x2ce00 & 0xFF, 0x2ceff & 0xFF}, + {0x2cf00 & 0xFF, 0x2cfff & 0xFF}, + {0x2d000 & 0xFF, 0x2d0ff & 0xFF}, + {0x2d100 & 0xFF, 0x2d1ff & 0xFF}, + {0x2d200 & 0xFF, 0x2d2ff & 0xFF}, + {0x2d300 & 0xFF, 0x2d3ff & 0xFF}, + {0x2d400 & 0xFF, 0x2d4ff & 0xFF}, + {0x2d500 & 0xFF, 0x2d5ff & 0xFF}, + {0x2d600 & 0xFF, 0x2d6ff & 0xFF}, + {0x2d700 & 0xFF, 0x2d7ff & 0xFF}, + {0x2d800 & 0xFF, 0x2d8ff & 0xFF}, + {0x2d900 & 0xFF, 0x2d9ff & 0xFF}, + {0x2da00 & 0xFF, 0x2daff & 0xFF}, + {0x2db00 & 0xFF, 0x2dbff & 0xFF}, + {0x2dc00 & 0xFF, 0x2dcff & 0xFF}, + {0x2dd00 & 0xFF, 0x2ddff & 0xFF}, + {0x2de00 & 0xFF, 0x2deff & 0xFF}, + {0x2df00 & 0xFF, 0x2dfff & 0xFF}, + {0x2e000 & 0xFF, 0x2e0ff & 0xFF}, + {0x2e100 & 0xFF, 0x2e1ff & 0xFF}, + {0x2e200 & 0xFF, 0x2e2ff & 0xFF}, + {0x2e300 & 0xFF, 0x2e3ff & 0xFF}, + {0x2e400 & 0xFF, 0x2e4ff & 0xFF}, + {0x2e500 & 0xFF, 0x2e5ff & 0xFF}, + {0x2e600 & 0xFF, 0x2e6ff & 0xFF}, + {0x2e700 & 0xFF, 0x2e7ff & 0xFF}, + {0x2e800 & 0xFF, 0x2e8ff & 0xFF}, + {0x2e900 & 0xFF, 0x2e9ff & 0xFF}, + {0x2ea00 & 0xFF, 0x2eaff & 0xFF}, + {0x2eb00 & 0xFF, 0x2ebff & 0xFF}, + {0x2ec00 & 0xFF, 0x2ecff & 0xFF}, + {0x2ed00 & 0xFF, 0x2edff & 0xFF}, + {0x2ee00 & 0xFF, 0x2eeff & 0xFF}, + {0x2ef00 & 0xFF, 0x2efff & 0xFF}, + {0x2f000 & 0xFF, 0x2f0ff & 0xFF}, + {0x2f100 & 0xFF, 0x2f1ff & 0xFF}, + {0x2f200 & 0xFF, 0x2f2ff & 0xFF}, + {0x2f300 & 0xFF, 0x2f3ff & 0xFF}, + {0x2f400 & 0xFF, 0x2f4ff & 0xFF}, + {0x2f500 & 0xFF, 0x2f5ff & 0xFF}, + {0x2f600 & 0xFF, 0x2f6ff & 0xFF}, + {0x2f700 & 0xFF, 0x2f7ff & 0xFF}, + {0x2f800 & 0xFF, 0x2f8ff & 0xFF}, + {0x2f900 & 0xFF, 0x2f9ff & 0xFF}, + {0x2fa00 & 0xFF, 0x2faff & 0xFF}, + {0x2fb00 & 0xFF, 0x2fbff & 0xFF}, + {0x2fc00 & 0xFF, 0x2fcff & 0xFF}, + {0x2fd00 & 0xFF, 0x2fdff & 0xFF}, + {0x2fe00 & 0xFF, 0x2feff & 0xFF}, + {0x2ff00 & 0xFF, 0x2fffd & 0xFF}, + {0x30000 & 0xFF, 0x300ff & 0xFF}, + {0x30100 & 0xFF, 0x301ff & 0xFF}, + {0x30200 & 0xFF, 0x302ff & 0xFF}, + {0x30300 & 0xFF, 0x303ff & 0xFF}, + {0x30400 & 0xFF, 0x304ff & 0xFF}, + {0x30500 & 0xFF, 0x305ff & 0xFF}, + {0x30600 & 0xFF, 0x306ff & 0xFF}, + {0x30700 & 0xFF, 0x307ff & 0xFF}, + {0x30800 & 0xFF, 0x308ff & 0xFF}, + {0x30900 & 0xFF, 0x309ff & 0xFF}, + {0x30a00 & 0xFF, 0x30aff & 0xFF}, + {0x30b00 & 0xFF, 0x30bff & 0xFF}, + {0x30c00 & 0xFF, 0x30cff & 0xFF}, + {0x30d00 & 0xFF, 0x30dff & 0xFF}, + {0x30e00 & 0xFF, 0x30eff & 0xFF}, + {0x30f00 & 0xFF, 0x30fff & 0xFF}, + {0x31000 & 0xFF, 0x310ff & 0xFF}, + {0x31100 & 0xFF, 0x311ff & 0xFF}, + {0x31200 & 0xFF, 0x312ff & 0xFF}, + {0x31300 & 0xFF, 0x313ff & 0xFF}, + {0x31400 & 0xFF, 0x314ff & 0xFF}, + {0x31500 & 0xFF, 0x315ff & 0xFF}, + {0x31600 & 0xFF, 0x316ff & 0xFF}, + {0x31700 & 0xFF, 0x317ff & 0xFF}, + {0x31800 & 0xFF, 0x318ff & 0xFF}, + {0x31900 & 0xFF, 0x319ff & 0xFF}, + {0x31a00 & 0xFF, 0x31aff & 0xFF}, + {0x31b00 & 0xFF, 0x31bff & 0xFF}, + {0x31c00 & 0xFF, 0x31cff & 0xFF}, + {0x31d00 & 0xFF, 0x31dff & 0xFF}, + {0x31e00 & 0xFF, 0x31eff & 0xFF}, + {0x31f00 & 0xFF, 0x31fff & 0xFF}, + {0x32000 & 0xFF, 0x320ff & 0xFF}, + {0x32100 & 0xFF, 0x321ff & 0xFF}, + {0x32200 & 0xFF, 0x322ff & 0xFF}, + {0x32300 & 0xFF, 0x323ff & 0xFF}, + {0x32400 & 0xFF, 0x324ff & 0xFF}, + {0x32500 & 0xFF, 0x325ff & 0xFF}, + {0x32600 & 0xFF, 0x326ff & 0xFF}, + {0x32700 & 0xFF, 0x327ff & 0xFF}, + {0x32800 & 0xFF, 0x328ff & 0xFF}, + {0x32900 & 0xFF, 0x329ff & 0xFF}, + {0x32a00 & 0xFF, 0x32aff & 0xFF}, + {0x32b00 & 0xFF, 0x32bff & 0xFF}, + {0x32c00 & 0xFF, 0x32cff & 0xFF}, + {0x32d00 & 0xFF, 0x32dff & 0xFF}, + {0x32e00 & 0xFF, 0x32eff & 0xFF}, + {0x32f00 & 0xFF, 0x32fff & 0xFF}, + {0x33000 & 0xFF, 0x330ff & 0xFF}, + {0x33100 & 0xFF, 0x331ff & 0xFF}, + {0x33200 & 0xFF, 0x332ff & 0xFF}, + {0x33300 & 0xFF, 0x333ff & 0xFF}, + {0x33400 & 0xFF, 0x334ff & 0xFF}, + {0x33500 & 0xFF, 0x335ff & 0xFF}, + {0x33600 & 0xFF, 0x336ff & 0xFF}, + {0x33700 & 0xFF, 0x337ff & 0xFF}, + {0x33800 & 0xFF, 0x338ff & 0xFF}, + {0x33900 & 0xFF, 0x339ff & 0xFF}, + {0x33a00 & 0xFF, 0x33aff & 0xFF}, + {0x33b00 & 0xFF, 0x33bff & 0xFF}, + {0x33c00 & 0xFF, 0x33cff & 0xFF}, + {0x33d00 & 0xFF, 0x33dff & 0xFF}, + {0x33e00 & 0xFF, 0x33eff & 0xFF}, + {0x33f00 & 0xFF, 0x33fff & 0xFF}, + {0x34000 & 0xFF, 0x340ff & 0xFF}, + {0x34100 & 0xFF, 0x341ff & 0xFF}, + {0x34200 & 0xFF, 0x342ff & 0xFF}, + {0x34300 & 0xFF, 0x343ff & 0xFF}, + {0x34400 & 0xFF, 0x344ff & 0xFF}, + {0x34500 & 0xFF, 0x345ff & 0xFF}, + {0x34600 & 0xFF, 0x346ff & 0xFF}, + {0x34700 & 0xFF, 0x347ff & 0xFF}, + {0x34800 & 0xFF, 0x348ff & 0xFF}, + {0x34900 & 0xFF, 0x349ff & 0xFF}, + {0x34a00 & 0xFF, 0x34aff & 0xFF}, + {0x34b00 & 0xFF, 0x34bff & 0xFF}, + {0x34c00 & 0xFF, 0x34cff & 0xFF}, + {0x34d00 & 0xFF, 0x34dff & 0xFF}, + {0x34e00 & 0xFF, 0x34eff & 0xFF}, + {0x34f00 & 0xFF, 0x34fff & 0xFF}, + {0x35000 & 0xFF, 0x350ff & 0xFF}, + {0x35100 & 0xFF, 0x351ff & 0xFF}, + {0x35200 & 0xFF, 0x352ff & 0xFF}, + {0x35300 & 0xFF, 0x353ff & 0xFF}, + {0x35400 & 0xFF, 0x354ff & 0xFF}, + {0x35500 & 0xFF, 0x355ff & 0xFF}, + {0x35600 & 0xFF, 0x356ff & 0xFF}, + {0x35700 & 0xFF, 0x357ff & 0xFF}, + {0x35800 & 0xFF, 0x358ff & 0xFF}, + {0x35900 & 0xFF, 0x359ff & 0xFF}, + {0x35a00 & 0xFF, 0x35aff & 0xFF}, + {0x35b00 & 0xFF, 0x35bff & 0xFF}, + {0x35c00 & 0xFF, 0x35cff & 0xFF}, + {0x35d00 & 0xFF, 0x35dff & 0xFF}, + {0x35e00 & 0xFF, 0x35eff & 0xFF}, + {0x35f00 & 0xFF, 0x35fff & 0xFF}, + {0x36000 & 0xFF, 0x360ff & 0xFF}, + {0x36100 & 0xFF, 0x361ff & 0xFF}, + {0x36200 & 0xFF, 0x362ff & 0xFF}, + {0x36300 & 0xFF, 0x363ff & 0xFF}, + {0x36400 & 0xFF, 0x364ff & 0xFF}, + {0x36500 & 0xFF, 0x365ff & 0xFF}, + {0x36600 & 0xFF, 0x366ff & 0xFF}, + {0x36700 & 0xFF, 0x367ff & 0xFF}, + {0x36800 & 0xFF, 0x368ff & 0xFF}, + {0x36900 & 0xFF, 0x369ff & 0xFF}, + {0x36a00 & 0xFF, 0x36aff & 0xFF}, + {0x36b00 & 0xFF, 0x36bff & 0xFF}, + {0x36c00 & 0xFF, 0x36cff & 0xFF}, + {0x36d00 & 0xFF, 0x36dff & 0xFF}, + {0x36e00 & 0xFF, 0x36eff & 0xFF}, + {0x36f00 & 0xFF, 0x36fff & 0xFF}, + {0x37000 & 0xFF, 0x370ff & 0xFF}, + {0x37100 & 0xFF, 0x371ff & 0xFF}, + {0x37200 & 0xFF, 0x372ff & 0xFF}, + {0x37300 & 0xFF, 0x373ff & 0xFF}, + {0x37400 & 0xFF, 0x374ff & 0xFF}, + {0x37500 & 0xFF, 0x375ff & 0xFF}, + {0x37600 & 0xFF, 0x376ff & 0xFF}, + {0x37700 & 0xFF, 0x377ff & 0xFF}, + {0x37800 & 0xFF, 0x378ff & 0xFF}, + {0x37900 & 0xFF, 0x379ff & 0xFF}, + {0x37a00 & 0xFF, 0x37aff & 0xFF}, + {0x37b00 & 0xFF, 0x37bff & 0xFF}, + {0x37c00 & 0xFF, 0x37cff & 0xFF}, + {0x37d00 & 0xFF, 0x37dff & 0xFF}, + {0x37e00 & 0xFF, 0x37eff & 0xFF}, + {0x37f00 & 0xFF, 0x37fff & 0xFF}, + {0x38000 & 0xFF, 0x380ff & 0xFF}, + {0x38100 & 0xFF, 0x381ff & 0xFF}, + {0x38200 & 0xFF, 0x382ff & 0xFF}, + {0x38300 & 0xFF, 0x383ff & 0xFF}, + {0x38400 & 0xFF, 0x384ff & 0xFF}, + {0x38500 & 0xFF, 0x385ff & 0xFF}, + {0x38600 & 0xFF, 0x386ff & 0xFF}, + {0x38700 & 0xFF, 0x387ff & 0xFF}, + {0x38800 & 0xFF, 0x388ff & 0xFF}, + {0x38900 & 0xFF, 0x389ff & 0xFF}, + {0x38a00 & 0xFF, 0x38aff & 0xFF}, + {0x38b00 & 0xFF, 0x38bff & 0xFF}, + {0x38c00 & 0xFF, 0x38cff & 0xFF}, + {0x38d00 & 0xFF, 0x38dff & 0xFF}, + {0x38e00 & 0xFF, 0x38eff & 0xFF}, + {0x38f00 & 0xFF, 0x38fff & 0xFF}, + {0x39000 & 0xFF, 0x390ff & 0xFF}, + {0x39100 & 0xFF, 0x391ff & 0xFF}, + {0x39200 & 0xFF, 0x392ff & 0xFF}, + {0x39300 & 0xFF, 0x393ff & 0xFF}, + {0x39400 & 0xFF, 0x394ff & 0xFF}, + {0x39500 & 0xFF, 0x395ff & 0xFF}, + {0x39600 & 0xFF, 0x396ff & 0xFF}, + {0x39700 & 0xFF, 0x397ff & 0xFF}, + {0x39800 & 0xFF, 0x398ff & 0xFF}, + {0x39900 & 0xFF, 0x399ff & 0xFF}, + {0x39a00 & 0xFF, 0x39aff & 0xFF}, + {0x39b00 & 0xFF, 0x39bff & 0xFF}, + {0x39c00 & 0xFF, 0x39cff & 0xFF}, + {0x39d00 & 0xFF, 0x39dff & 0xFF}, + {0x39e00 & 0xFF, 0x39eff & 0xFF}, + {0x39f00 & 0xFF, 0x39fff & 0xFF}, + {0x3a000 & 0xFF, 0x3a0ff & 0xFF}, + {0x3a100 & 0xFF, 0x3a1ff & 0xFF}, + {0x3a200 & 0xFF, 0x3a2ff & 0xFF}, + {0x3a300 & 0xFF, 0x3a3ff & 0xFF}, + {0x3a400 & 0xFF, 0x3a4ff & 0xFF}, + {0x3a500 & 0xFF, 0x3a5ff & 0xFF}, + {0x3a600 & 0xFF, 0x3a6ff & 0xFF}, + {0x3a700 & 0xFF, 0x3a7ff & 0xFF}, + {0x3a800 & 0xFF, 0x3a8ff & 0xFF}, + {0x3a900 & 0xFF, 0x3a9ff & 0xFF}, + {0x3aa00 & 0xFF, 0x3aaff & 0xFF}, + {0x3ab00 & 0xFF, 0x3abff & 0xFF}, + {0x3ac00 & 0xFF, 0x3acff & 0xFF}, + {0x3ad00 & 0xFF, 0x3adff & 0xFF}, + {0x3ae00 & 0xFF, 0x3aeff & 0xFF}, + {0x3af00 & 0xFF, 0x3afff & 0xFF}, + {0x3b000 & 0xFF, 0x3b0ff & 0xFF}, + {0x3b100 & 0xFF, 0x3b1ff & 0xFF}, + {0x3b200 & 0xFF, 0x3b2ff & 0xFF}, + {0x3b300 & 0xFF, 0x3b3ff & 0xFF}, + {0x3b400 & 0xFF, 0x3b4ff & 0xFF}, + {0x3b500 & 0xFF, 0x3b5ff & 0xFF}, + {0x3b600 & 0xFF, 0x3b6ff & 0xFF}, + {0x3b700 & 0xFF, 0x3b7ff & 0xFF}, + {0x3b800 & 0xFF, 0x3b8ff & 0xFF}, + {0x3b900 & 0xFF, 0x3b9ff & 0xFF}, + {0x3ba00 & 0xFF, 0x3baff & 0xFF}, + {0x3bb00 & 0xFF, 0x3bbff & 0xFF}, + {0x3bc00 & 0xFF, 0x3bcff & 0xFF}, + {0x3bd00 & 0xFF, 0x3bdff & 0xFF}, + {0x3be00 & 0xFF, 0x3beff & 0xFF}, + {0x3bf00 & 0xFF, 0x3bfff & 0xFF}, + {0x3c000 & 0xFF, 0x3c0ff & 0xFF}, + {0x3c100 & 0xFF, 0x3c1ff & 0xFF}, + {0x3c200 & 0xFF, 0x3c2ff & 0xFF}, + {0x3c300 & 0xFF, 0x3c3ff & 0xFF}, + {0x3c400 & 0xFF, 0x3c4ff & 0xFF}, + {0x3c500 & 0xFF, 0x3c5ff & 0xFF}, + {0x3c600 & 0xFF, 0x3c6ff & 0xFF}, + {0x3c700 & 0xFF, 0x3c7ff & 0xFF}, + {0x3c800 & 0xFF, 0x3c8ff & 0xFF}, + {0x3c900 & 0xFF, 0x3c9ff & 0xFF}, + {0x3ca00 & 0xFF, 0x3caff & 0xFF}, + {0x3cb00 & 0xFF, 0x3cbff & 0xFF}, + {0x3cc00 & 0xFF, 0x3ccff & 0xFF}, + {0x3cd00 & 0xFF, 0x3cdff & 0xFF}, + {0x3ce00 & 0xFF, 0x3ceff & 0xFF}, + {0x3cf00 & 0xFF, 0x3cfff & 0xFF}, + {0x3d000 & 0xFF, 0x3d0ff & 0xFF}, + {0x3d100 & 0xFF, 0x3d1ff & 0xFF}, + {0x3d200 & 0xFF, 0x3d2ff & 0xFF}, + {0x3d300 & 0xFF, 0x3d3ff & 0xFF}, + {0x3d400 & 0xFF, 0x3d4ff & 0xFF}, + {0x3d500 & 0xFF, 0x3d5ff & 0xFF}, + {0x3d600 & 0xFF, 0x3d6ff & 0xFF}, + {0x3d700 & 0xFF, 0x3d7ff & 0xFF}, + {0x3d800 & 0xFF, 0x3d8ff & 0xFF}, + {0x3d900 & 0xFF, 0x3d9ff & 0xFF}, + {0x3da00 & 0xFF, 0x3daff & 0xFF}, + {0x3db00 & 0xFF, 0x3dbff & 0xFF}, + {0x3dc00 & 0xFF, 0x3dcff & 0xFF}, + {0x3dd00 & 0xFF, 0x3ddff & 0xFF}, + {0x3de00 & 0xFF, 0x3deff & 0xFF}, + {0x3df00 & 0xFF, 0x3dfff & 0xFF}, + {0x3e000 & 0xFF, 0x3e0ff & 0xFF}, + {0x3e100 & 0xFF, 0x3e1ff & 0xFF}, + {0x3e200 & 0xFF, 0x3e2ff & 0xFF}, + {0x3e300 & 0xFF, 0x3e3ff & 0xFF}, + {0x3e400 & 0xFF, 0x3e4ff & 0xFF}, + {0x3e500 & 0xFF, 0x3e5ff & 0xFF}, + {0x3e600 & 0xFF, 0x3e6ff & 0xFF}, + {0x3e700 & 0xFF, 0x3e7ff & 0xFF}, + {0x3e800 & 0xFF, 0x3e8ff & 0xFF}, + {0x3e900 & 0xFF, 0x3e9ff & 0xFF}, + {0x3ea00 & 0xFF, 0x3eaff & 0xFF}, + {0x3eb00 & 0xFF, 0x3ebff & 0xFF}, + {0x3ec00 & 0xFF, 0x3ecff & 0xFF}, + {0x3ed00 & 0xFF, 0x3edff & 0xFF}, + {0x3ee00 & 0xFF, 0x3eeff & 0xFF}, + {0x3ef00 & 0xFF, 0x3efff & 0xFF}, + {0x3f000 & 0xFF, 0x3f0ff & 0xFF}, + {0x3f100 & 0xFF, 0x3f1ff & 0xFF}, + {0x3f200 & 0xFF, 0x3f2ff & 0xFF}, + {0x3f300 & 0xFF, 0x3f3ff & 0xFF}, + {0x3f400 & 0xFF, 0x3f4ff & 0xFF}, + {0x3f500 & 0xFF, 0x3f5ff & 0xFF}, + {0x3f600 & 0xFF, 0x3f6ff & 0xFF}, + {0x3f700 & 0xFF, 0x3f7ff & 0xFF}, + {0x3f800 & 0xFF, 0x3f8ff & 0xFF}, + {0x3f900 & 0xFF, 0x3f9ff & 0xFF}, + {0x3fa00 & 0xFF, 0x3faff & 0xFF}, + {0x3fb00 & 0xFF, 0x3fbff & 0xFF}, + {0x3fc00 & 0xFF, 0x3fcff & 0xFF}, + {0x3fd00 & 0xFF, 0x3fdff & 0xFF}, + {0x3fe00 & 0xFF, 0x3feff & 0xFF}, + {0x3ff00 & 0xFF, 0x3fffd & 0xFF}, + {0xe0001 & 0xFF, 0xe0001 & 0xFF}, + {0xe0020 & 0xFF, 0xe007f & 0xFF}, + {0xe0100 & 0xFF, 0xe01ef & 0xFF}}; + +static const uint8_t unicode_classtab[]={ + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_LF, + UNICODE_LB_BK, + UNICODE_LB_CR, + UNICODE_LB_CM, + UNICODE_LB_SP, + UNICODE_LB_EX, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_OP, + UNICODE_LB_CP, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_IS, + UNICODE_LB_HY, + UNICODE_LB_IS, + UNICODE_LB_SY, + UNICODE_LB_NU, + UNICODE_LB_IS, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_PR, + UNICODE_LB_CP, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_BA, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NL, + UNICODE_LB_CM, + UNICODE_LB_GL, + UNICODE_LB_OP, + UNICODE_LB_PO, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_GL, + UNICODE_LB_CM, + UNICODE_LB_GL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_IS, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_IS, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_EX, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_IS, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_EX, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_PO, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_IS, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_PR, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_GL, + UNICODE_LB_BB, + UNICODE_LB_BA, + UNICODE_LB_GL, + UNICODE_LB_EX, + UNICODE_LB_GL, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_BA, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_GL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_JL, + UNICODE_LB_JV, + UNICODE_LB_JT, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_BA, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_GL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_GL, + UNICODE_LB_BA, + UNICODE_LB_ZW, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_GL, + UNICODE_LB_BA, + UNICODE_LB_B2, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_OP, + UNICODE_LB_QU, + UNICODE_LB_OP, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_IN, + UNICODE_LB_BA, + UNICODE_LB_BK, + UNICODE_LB_CM, + UNICODE_LB_GL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_IS, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_WJ, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_PO, + UNICODE_LB_PR, + UNICODE_LB_PO, + UNICODE_LB_PR, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_EX, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_EX, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_QU, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_OP, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_AL, + UNICODE_LB_QU, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_BA, + UNICODE_LB_EX, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_NS, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_CM, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_CM, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_EX, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BB, + UNICODE_LB_EX, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_NU, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_JL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_CM, + UNICODE_LB_NU, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_H2, + UNICODE_LB_H3, + UNICODE_LB_JV, + UNICODE_LB_JT, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_IS, + UNICODE_LB_CL, + UNICODE_LB_IS, + UNICODE_LB_EX, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_IN, + UNICODE_LB_CM, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_NS, + UNICODE_LB_EX, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_PR, + UNICODE_LB_PO, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_WJ, + UNICODE_LB_EX, + UNICODE_LB_ID, + UNICODE_LB_PR, + UNICODE_LB_PO, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_NS, + UNICODE_LB_ID, + UNICODE_LB_EX, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_ID, + UNICODE_LB_CL, + UNICODE_LB_ID, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_NS, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_PO, + UNICODE_LB_PR, + UNICODE_LB_ID, + UNICODE_LB_PR, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CB, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_BA, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_OP, + UNICODE_LB_CL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_CM, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_NU, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_AL, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_ID, + UNICODE_LB_CM, + UNICODE_LB_CM, + UNICODE_LB_CM}; + +static const size_t unicode_indextab[]={ + 0, + 56, + 57, + 64, + 76, + 79, + 96, + 124, + 139, + 151, + 188, + 224, + 262, + 295, + 323, + 355, + 403, + 426, + 429, + 443, + 452, + 454, + 455, + 463, + 487, + 502, + 517, + 526, + 545, + 560, + 563, + 564, + 582, + 636, + 644, + 647, + 651, + 654, + 655, + 656, + 692, + 693, + 725, + 726, + 728, + 737, + 752, + 776, + 778, + 858, + 863, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 980, + 981, + 982, + 983, + 987, + 988, + 1004, + 1008, + 1030, + 1047, + 1070, + 1080, + 1100, + 1119, + 1138, + 1157, + 1176, + 1195, + 1214, + 1234, + 1253, + 1272, + 1291, + 1310, + 1329, + 1348, + 1368, + 1387, + 1406, + 1425, + 1444, + 1463, + 1482, + 1502, + 1521, + 1540, + 1559, + 1578, + 1597, + 1616, + 1636, + 1655, + 1674, + 1693, + 1712, + 1731, + 1750, + 1770, + 1789, + 1808, + 1827, + 1846, + 1865, + 1884, + 1904, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1925, + 1926, + 1927, + 1938, + 1939, + 1947, + 1997, + 2043, + 2050, + 2056, + 2058, + 2067, + 2069, + 2069, + 2069, + 2069, + 2077, + 2081, + 2094, + 2099, + 2100, + 2100, + 2101, + 2101, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2113, + 2114, + 2115, + 2116, + 2117, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2119, + 2120, + 2121, + 2132, + 2136, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2137, + 2138, + 2139, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2140, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2141, + 2142, + 2152, + 2155, + 2157, + 2167, + 2177, + 2179, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2181, + 2187, + 2192, + 2196, + 2203, + 2207, + 2210, + 2223, + 2224, + 2224, + 2224, + 2224, + 2224, + 2224, + 2224, + 2224, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2736, + 2738, + 2739}; + diff --git a/unicode/linebreaktab_internal.h b/unicode/linebreaktab_internal.h new file mode 100644 index 0000000..921ef77 --- /dev/null +++ b/unicode/linebreaktab_internal.h @@ -0,0 +1,49 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#ifndef linebreaktab_internal_h +#define linebreaktab_internal_h + +#define UNICODE_LB_BK 0x00 +#define UNICODE_LB_CR 0x01 +#define UNICODE_LB_LF 0x02 +#define UNICODE_LB_CM 0x03 +#define UNICODE_LB_NL 0x04 +#define UNICODE_LB_SG 0x05 +#define UNICODE_LB_WJ 0x06 +#define UNICODE_LB_ZW 0x07 +#define UNICODE_LB_GL 0x08 +#define UNICODE_LB_SP 0x09 +#define UNICODE_LB_B2 0x10 +#define UNICODE_LB_BA 0x11 +#define UNICODE_LB_BB 0x12 +#define UNICODE_LB_HY 0x13 +#define UNICODE_LB_CB 0x14 +#define UNICODE_LB_CL 0x20 +#define UNICODE_LB_CP 0x21 +#define UNICODE_LB_EX 0x22 +#define UNICODE_LB_IN 0x23 +#define UNICODE_LB_NS 0x24 +#define UNICODE_LB_OP 0x25 +#define UNICODE_LB_QU 0x26 +#define UNICODE_LB_IS 0x30 +#define UNICODE_LB_NU 0x31 +#define UNICODE_LB_PO 0x32 +#define UNICODE_LB_PR 0x33 +#define UNICODE_LB_SY 0x34 +#define UNICODE_LB_AI 0x40 +#define UNICODE_LB_AL 0x41 +#define UNICODE_LB_H2 0x42 +#define UNICODE_LB_H3 0x43 +#define UNICODE_LB_ID 0x44 +#define UNICODE_LB_JL 0x45 +#define UNICODE_LB_JV 0x46 +#define UNICODE_LB_JT 0x47 +#define UNICODE_LB_SA 0x48 + +extern int unicode_lb_lookup(unicode_char ch); + +#endif diff --git a/unicode/linebreaktest.C b/unicode/linebreaktest.C new file mode 100644 index 0000000..0f20869 --- /dev/null +++ b/unicode/linebreaktest.C @@ -0,0 +1,201 @@ +#include "unicode_config.h" +#include "unicode.h" + +#include <iostream> +#include <fstream> +#include <sstream> +#include <iomanip> +#include <algorithm> +#include <functional> +#include <cstdlib> +#include <list> +#include <vector> + +static void testsuite() +{ + std::string buf; + int linenum=0; + + std::ifstream fp("LineBreakTest.txt"); + + if (!fp.is_open()) + exit(1); + + while (1) + { + buf.clear(); + + if (std::getline(fp, buf).eof() && buf.empty()) + break; + + ++linenum; + + buf.erase(std::find(buf.begin(), buf.end(), '#'), buf.end()); + + if (buf.empty()) + continue; + + std::list<std::string> words; + + for (std::string::iterator b=buf.begin(), e=buf.end(); b != e;) + { + if (isspace(*b)) + { + ++b; + continue; + } + + std::string::iterator p=b; + + while (b != e) + { + if (isspace(*b)) + break; + ++b; + } + + words.push_back(std::string(p, b)); + } + + std::vector<unicode_char> ubuf; + std::vector<int> status; + + while (1) + { + if (!words.empty() && words.front().size() > 1) + { + int expected=UNICODE_LB_MANDATORY; + + std::string s=words.front(); + + words.pop_front(); + + if ((unsigned char)s[0] == + (unsigned char)0xc3) + switch ( (unsigned char)s[1] ) { + case (unsigned char)0x97: + expected=UNICODE_LB_NONE; + break; + case (unsigned char)0xb7: + expected=UNICODE_LB_ALLOWED; + break; + } + + if (words.empty()) + break; + + status.push_back(expected); + + std::istringstream i(words.front()); + + unicode_char uc; + + i >> std::hex >> uc; + + words.pop_front(); + + if (!i.fail()) + { + ubuf.push_back(uc); + continue; + } + } + + std::cerr << "Parse error, line " << linenum + << ": " << buf << std::endl; + exit(1); + } + + std::vector<int> computed_status; + + typedef std::vector<unicode_char>::const_iterator ubuf_iter; + typedef mail::linebreak_iter<ubuf_iter> lb_iter; + + std::copy(lb_iter(ubuf.begin(), ubuf.end()), lb_iter(), + std::back_insert_iterator<std::vector<int> > + (computed_status)); + + std::replace(computed_status.begin(), + computed_status.end(), + UNICODE_LB_MANDATORY, + UNICODE_LB_ALLOWED); + + if (computed_status != status) + { + std::cerr << "Regression, line " << linenum + << ": " << buf << std::endl; + exit(1); + } + } +} + +static void testlinebreakc() +{ + static unicode_char str[]={'$', '(', 0x0300, 0x0301, 0x0302, 0x0303, + 0x0304, 0x0305, 0x0306, 0x0307, '1', '.', + '2', ' ', 'A'}; + + typedef std::vector<std::pair<int, unicode_char> > linebreakvec_t; + + linebreakvec_t linebreakvec; + + std::copy(mail::linebreakc_iter<unicode_char *>(str, + str + sizeof(str) + /sizeof(str[0])), + mail::linebreakc_iter<unicode_char *>(), + std::back_insert_iterator<linebreakvec_t> + (linebreakvec)); + + if (linebreakvec.size() == sizeof(str)/sizeof(str[0])) + { + size_t i; + + for (i=0; i<sizeof(str)/sizeof(str[0]); ++i) + { + if (str[i] != linebreakvec[i].second || + linebreakvec[i].first != + (i < sizeof(str)/sizeof(str[0])-1 + ? UNICODE_LB_NONE:UNICODE_LB_ALLOWED)) + break; + } + + if (i == sizeof(str)/sizeof(str[0])) + return; + } + std::cerr << "Line break test 1 failed" << std::endl; +} + +int main(int argc, char **argv) +{ + testsuite(); + testlinebreakc(); + + std::string convteststr="0000000000000000000000000000000\xe3\x82\xa2"; + + std::vector<unicode_char> uc; + + mail::iconvert::tou + ::convert(convteststr, "utf-8", uc); + + std::vector<unicode_char>::iterator e(uc.end()), + b(std::find_if(uc.begin(), e, + std::not1(std::bind2nd(std::equal_to<unicode_char> + (), + unicode_char('0'))))); + + if (b == e || *b++ != 0x30A2 || b != e) + { + std::cerr << "mail::iconvert::tou::convert failed" + << std::endl; + exit(1); + } + + if (mail::iconvert::fromu::convert(uc, "utf-8") != convteststr) + { + std::cerr << "mail::iconvert::fromu::convert failed" + << std::endl; + exit(1); + } + + return 0; +} diff --git a/unicode/mkcommon.pm b/unicode/mkcommon.pm new file mode 100644 index 0000000..2969f32 --- /dev/null +++ b/unicode/mkcommon.pm @@ -0,0 +1,192 @@ +package mkcommon; + +use 5.012002; +use strict; +use warnings; + +require Exporter; + +our @ISA = qw(Exporter); + +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. + +# This allows declaration use mkcommon ':all'; +# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK +# will save memory. +our %EXPORT_TAGS = ( 'all' => [ qw( + +) ] ); + +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); + +our @EXPORT = qw( + +); + +our $VERSION = '0.01'; + +my $BLOCK_SIZE=256; + +# Preloaded methods go here. + +sub new { + + my $this=shift; + + my $class = ref($this) || $this; + my $self = {}; + bless $self, $class; + + $$self{'char_array'}=[]; + $$self{'char_class'}=[]; + $$self{'char_start'}=[0]; + + $$self{'last_block'}=-1; + $$self{'last'}=""; + $$self{'last_f'}=0; + $$self{'last_l'}=0; + + return $self; +} + +sub _doemit_block { + my $this=shift; + + my $f=shift; + my $l=shift; + + push @{$$this{'char_array'}}, [$f, $l]; + push @{$$this{'char_class'}}, $$this{'last'}; +} + +sub _doemit_endblock { + + my $this=shift; + + push @{$$this{'char_start'}}, $#{$$this{'char_array'}}+1; +} + +# _doemit invokes _doemit_block() for each unicode char range with a given +# linebreaking class. However, once a unicode char range starts in a different +# $BLOCK_SIZE character class, call _doemit_endblock() before calling _doemit_block(). +# +# If a single unicode char range crosses a $BLOCK_SIZE character class boundary, +# split it at the boundary; call _doemit_endblock() to finish the current $BLOCK_SIZE +# char boundary, call _doemit_endblock(), then call _doemit_block() for the +# rest of the char range. + + +sub _doemit { + + my $this=shift; + + $this->_doemit_endblock() + if int($$this{'last_f'} / $BLOCK_SIZE) + != $$this{'last_block'} && $$this{'last_block'} != -1; + + if (int($$this{'last_f'} / $BLOCK_SIZE) != int($$this{'last_l'} / $BLOCK_SIZE)) + { + while (int($$this{'last_f'} / $BLOCK_SIZE) != int($$this{'last_l'} / $BLOCK_SIZE)) + { + my $n=int($$this{'last_f'} / $BLOCK_SIZE) * $BLOCK_SIZE + ($BLOCK_SIZE-1); + + $this->_doemit_block($$this{'last_f'}, $n); + $this->_doemit_endblock(); + $$this{'last_f'}=$n+1; + } + } + $this->_doemit_block($$this{'last_f'}, $$this{'last_l'}); + + $$this{'last_block'}=int($$this{'last_l'} / $BLOCK_SIZE); +} + +# +# Coalesce adjacent unicode char blocks that have the same linebreaking +# property. Invoke _doemit() for the accumulate unicode char range once +# a range with a different linebreaking class is seen. + +sub range { + + my $this=shift; + + my $f=shift; + my $l=shift; + my $t=shift; + + if ($$this{'last_l'} + 1 == $f && $$this{'last'} eq $t) + { + $$this{'last_l'}=$l; + return; + } + + $this->_doemit() if $$this{'last'}; # New linebreaking class + + $$this{'last_f'}=$f; + $$this{'last_l'}=$l; + $$this{'last'}=$t; +} + +sub output { + my $this=shift; + + $this->_doemit(); # Emit last linebreaking unicode char range class + + $this->_doemit_endblock(); # End of the most recent $BLOCK_SIZE char range class + + print "static const uint8_t unicode_rangetab[][2]={\n"; + + my $comma="\t"; + + my $modulo=sprintf("0x%X", $BLOCK_SIZE-1); + + foreach ( @{$$this{'char_array'}} ) + { + print "${comma}{0x" . sprintf("%04x", $$_[0]) . " & $modulo, 0x" + . sprintf("%04x", $$_[1]) . " & $modulo}"; + $comma=",\n\t"; + } + + print "};\n\n"; + + print "static const uint8_t unicode_classtab[]={\n"; + + $comma="\t"; + foreach ( @{$$this{'char_class'}} ) + { + print "${comma}$_"; + $comma=",\n\t"; + } + + print "};\n\n"; + + print "static const size_t unicode_indextab[]={\n"; + + $comma="\t"; + + my $prev_block=-1; + foreach (@{$$this{'char_start'}}) + { + my $sp=$_; + my $cnt=1; + + if ($sp <= $#{$$this{'char_array'}}) + { + my $block=int($$this{'char_array'}->[$sp]->[0] / $BLOCK_SIZE); + + $cnt = $block - $prev_block; + $prev_block=$block; + } + + foreach (1..$cnt) + { + print "$comma$sp"; + $comma=",\n\t"; + } + } + + print "};\n\n"; +} + +1; diff --git a/unicode/mkeastasianwidth.pl b/unicode/mkeastasianwidth.pl new file mode 100644 index 0000000..0ddf800 --- /dev/null +++ b/unicode/mkeastasianwidth.pl @@ -0,0 +1,52 @@ +#! /usr/bin/perl + +# USAGE: perl mkeastasianwidth.pl > charwidth.c + +use IO::File; + +my $fh=new IO::File "<EastAsianWidth.txt"; + +my $pb=-1; +my $pe=-1; + +print "static const unicode_char unicode_wcwidth_tab[][2]={\n"; + +sub full($$) { + my $b=hex(shift); + my $e=hex(shift); + + if ($b == $pe+1) + { + $pe=$e; + return; + } + + printf ("{0x%04x, 0x%04x},\n", $pb, $pe) unless $pb < 0; + + $pb=$b; + $pe=$e; +} + + +while (defined($_=<$fh>)) +{ + chomp; + s/#.*//; + + my @w=split(/;/); + + grep {s/^\s*//; s/\s*$//; } @w; + + next unless $w[1] eq "F" || $w[1] eq "W"; + + if ($w[0] =~ /(.*)\.\.(.*)/) + { + full($1, $2); + } + else + { + full($w[0], $w[0]); + } +} + +printf ("{0x%04x, 0x%04x}\n};\n", $pb, $pe); diff --git a/unicode/mkgraphemebreak.pl b/unicode/mkgraphemebreak.pl new file mode 100644 index 0000000..3b3cbc6 --- /dev/null +++ b/unicode/mkgraphemebreak.pl @@ -0,0 +1,60 @@ +#! /usr/bin/perl +# +# Compile GraphemeBreak.txt into C array declarations. +# +# The array's structure is [firstchar, lastchar, class], giving the +# linebreaking "class" for unicode character range firstchar-lastchar. +# +# The ranges are sorted in numerical order. +# +# An array gets generated for each block of 4096 unicode characters. +# +# Finally, two arrays get declared: a pointer to an array for each 4096 +# unicode character block, and the number of elements in the array. +# +# The pointer is NULL for each block of 4096 unicode characters that is not +# defined in LineBreak.txt +# +# By definition, a unicode character that is not listed in the array is +# class XX. + +use strict; +use warnings; +use mkcommon; + +open(F, "<GraphemeBreakProperty.txt") || die; + +# Read LineBreak.txt +# +# Invoke doclass() passing the first unicode char, the last unicode char, +# and the linebreaking class for the given unicode char range. + +my @breaklist; + +while (defined($_=<F>)) +{ + chomp; + + next unless /^([0-9A-F]+)(\.\.([0-9A-F]+))?\s*\;\s*([^\s]+)\s*/; + + my $f=$1; + my $l=$3; + my $t=$4; + + $l=$f unless $l; + + eval "\$f=0x$f"; + eval "\$l=0x$l"; + + push @breaklist, [$f, $l, $t]; +} + + +my $obj=mkcommon->new; + +foreach (sort { $$a[0] <=> $$b[0] } @breaklist) +{ + $obj->range($$_[0], $$_[1], "UNICODE_GRAPHEMEBREAK_$$_[2]"); +} + +$obj->output; diff --git a/unicode/mkhtmlent.pl b/unicode/mkhtmlent.pl new file mode 100644 index 0000000..7120ac7 --- /dev/null +++ b/unicode/mkhtmlent.pl @@ -0,0 +1,69 @@ +#! /usr/bin/perl +# +# Compile list of HTML 4.0/XHTML entities. + +my %ent=("amp" => 38, "lt" => 60, "gt" => 62); + +foreach ("xhtml-lat1.ent", "xhtml-special.ent", "xhtml-symbol.ent") +{ + open(F, "<$_") or die "$_: $!\n"; + + my $l; + + while (defined($l=<F>)) + { + chomp $l; + next unless $l =~ m/^<!ENTITY\s+([^\s]+)\s+"&#(\d+);">/; + + $ent{$1}=$2; + } +} + +print "static const char n[]={\n"; + +my $prev="\t"; + +foreach (sort keys %ent) +{ + my $n=$_; + + my $str=""; + + print $prev; + $prev=""; + + foreach (0..length($n)-1) + { + $str .= $prev . ord(substr($n, $_, 1)); + $prev=", "; + } + + print $str; + + $prev=","; + + $prev .= (" " x (40 - length($str))) + if (length($str) < 40); + + $prev .= " /* $n */\n\t"; +} + +substr($prev, 0, 1)=" "; + +$prev =~ s/\t//; + +print "$prev};\n\nstatic const struct i ii[]={"; + +$prev="\n\t"; + +my $n=0; + +foreach (sort keys %ent) +{ + print $prev . "{$n, " . length($_) . ", $ent{$_}" . "}"; + + $n += length($_); + $prev=",\n\t"; +} + +print "\n};\n"; diff --git a/unicode/mklinebreak.pl b/unicode/mklinebreak.pl new file mode 100644 index 0000000..c9b75e0 --- /dev/null +++ b/unicode/mklinebreak.pl @@ -0,0 +1,86 @@ +#! /usr/bin/perl +# +# Compile LineBreak.txt into C array declarations. +# +# The array's structure is [firstchar, lastchar, class], giving the +# linebreaking "class" for unicode character range firstchar-lastchar. +# +# The ranges are sorted in numerical order. +# +# An array gets generated for each block of 4096 unicode characters. +# +# Finally, two arrays get declared: a pointer to an array for each 4096 +# unicode character block, and the number of elements in the array. +# +# The pointer is NULL for each block of 4096 unicode characters that is not +# defined in LineBreak.txt +# +# By definition, a unicode character that is not listed in the array is +# class XX. + +use strict; +use warnings; +use mkcommon; + +my %general_category; + +open(UC, "<UnicodeData.txt") || die; + +while (defined($_=<UC>)) +{ + chomp; + + my @f=split(/;/); + + my $cp; + + eval "\$cp=0x$f[0]"; + + $general_category{$cp}=$f[2]; +} + +my $obj=mkcommon->new; + +open(F, "<LineBreak.txt") || die; + +while (defined($_=<F>)) +{ + chomp; + + next unless /^([0-9A-F]+)(\.\.([0-9A-F]+))?\;([^\s][^\s])\s*/; + + my $f=$1; + my $l=$3; + my $t=$4; + + $l=$f unless $l; + + eval "\$f=0x$f"; + eval "\$l=0x$l"; + + next if $t eq "XX"; + + if ($t eq "SA") + { + while ($f <= $l) + { + die "Cannot find general_category for $f\n" + unless exists $general_category{$f}; + + $obj->range($f, $f, + $general_category{$f} eq "Mn" || + $general_category{$f} eq "Mc" ? + "UNICODE_LB_CM":"UNICODE_LB_AL"); + # LB1 rule + ++$f; + } + } + else + { + $t="AL" if $t eq "AI" || $t eq "SG"; # LB1 rule + + $obj->range($f, $l, "UNICODE_LB_$t"); + } +} + +$obj->output; diff --git a/unicode/mkultcase.pl b/unicode/mkultcase.pl new file mode 100644 index 0000000..805e887 --- /dev/null +++ b/unicode/mkultcase.pl @@ -0,0 +1,116 @@ +# Copyright 2000-2004 Double Precision, Inc. +# See COPYING for distribution information. +# +# +# Generate unicode upper/lower/titlecase translations. + +print '/* +** Copyright 2000-2004 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode.h" + +'; + +my $set=shift; + +open (U, "UnicodeData.txt") || die "$!\n"; + +while (<U>) +{ + chomp; + +my @fields= split /;/; + +my ($code, $uc, $lc, $tc); + + $code="0x$fields[0]"; + eval "\$code=$code;"; + + $uc=$fields[12]; + if ($uc ne "") + { + eval "\$uc=0x$uc;"; + $UC{$code}=$uc; + $FLAG{$code}=1; + } + + $lc=$fields[13]; + if ($lc ne "") + { + eval "\$lc=0x$lc;"; + $LC{$code}=$lc; + $FLAG{$code}=1; + } + + $tc=$fields[14]; + if ($tc ne "") + { + eval "\$tc=0x$tc;"; + $TC{$code}=$tc; + $FLAG{$code}=1; + } +} + +close(U); + +my $tabsize=2048; + +grep ($bucket[ $_ % $tabsize ] .= "$_\n", keys %FLAG); + +my $maxcnt=0; + +for ($i=0; $i < $tabsize; $i++) +{ + my $cnt=0; + + grep ( ++$cnt, split (/\n/, $bucket[$i])); + + $maxcnt=$cnt if $cnt > $maxcnt; +} + +print "const unsigned unicode_case_hash=$tabsize;\n"; +print "/* unicode_case_maxbucket=" + . ($maxcnt+2) . "*/\n"; + +print "const unicode_char unicode_case_tab[][4]={\n"; + +my $idx=0; + +for ($i=0; $i<$tabsize; $i++) +{ + $offset[$i]=$idx; + + grep { + my $j=$_; + my $u=$UC{$j}+0; + my $l=$LC{$j}+0; + my $t=$TC{$j}+0; + + if ($u || $l || $t) + { + $u=$j unless $u; + $l=$j unless $l; + $t=$u unless $t; + + printf("{0x%04x,0x%04x,0x%04x,0x%04x},",$j,$u,$l,$t); + print "\n" if ($idx % 4) == 3; + ++$idx; + } + } split(/\n/, $bucket[$i]); +} +print "{0,0,0,0}}; + +const unsigned unicode_case_offset[$tabsize]={ +"; + +for ($i=0; $i<$tabsize;$i++) +{ + printf("%4d", $offset[$i]); + print "," if $i < $tabsize-1; + + print "\n" if ($i % 16) == 15; +} +print "};\n"; diff --git a/unicode/mkwordbreak.pl b/unicode/mkwordbreak.pl new file mode 100644 index 0000000..859050f --- /dev/null +++ b/unicode/mkwordbreak.pl @@ -0,0 +1,52 @@ +#! /usr/bin/perl +# +# Compile WordBreak.txt into C array declarations. +# +# The array's structure is [firstchar, lastchar, class], giving the +# linebreaking "class" for unicode character range firstchar-lastchar. +# +# The ranges are sorted in numerical order. +# +# An array gets generated for each block of 4096 unicode characters. +# +# Finally, two arrays get declared: a pointer to an array for each 4096 +# unicode character block, and the number of elements in the array. +# +# The pointer is NULL for each block of 4096 unicode characters that is not +# defined in WordBreak.txt + +use strict; +use warnings; +use mkcommon; + +my $obj=mkcommon->new; + +open(F, "<WordBreakProperty.txt") || die; + +my @table; + +while (defined($_=<F>)) +{ + chomp; + + next unless /^([0-9A-F]+)(\.\.([0-9A-F]+))?\s*\;\s*([^\s]+)\s*/; + + my $f=$1; + my $l=$3; + my $t=$4; + + $l=$f unless $l; + + eval "\$f=0x$f"; + eval "\$l=0x$l"; + + push @table, [$f, $l, $t]; +} + +grep { + + $obj->range($$_[0], $$_[1], "UNICODE_WB_$$_[2]"); + +} sort { $$a[0] <=> $$b[0] } @table; + +$obj->output; diff --git a/unicode/unicode.c b/unicode/unicode.c new file mode 100644 index 0000000..4ca098b --- /dev/null +++ b/unicode/unicode.c @@ -0,0 +1,1643 @@ +/* +** Copyright 2000-2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include "../rfc822/rfc822hdr.h" +#include <string.h> +#include <ctype.h> +#include <stdlib.h> +#include <iconv.h> +#include <errno.h> +#if HAVE_LOCALE_H +#if HAVE_SETLOCALE +#include <locale.h> +#if USE_LIBCHARSET +#if HAVE_LOCALCHARSET_H +#include <localcharset.h> +#elif HAVE_LIBCHARSET_H +#include <libcharset.h> +#endif /* HAVE_LOCALCHARSET_H */ +#elif HAVE_LANGINFO_CODESET +#include <langinfo.h> +#endif /* USE_LIBCHARSET */ +#endif /* HAVE_SETLOCALE */ +#endif /* HAVE_LOCALE_H */ + +static char default_chset_buf[32]; + +static void init_default_chset() +{ + const char *old_locale=NULL; + const char *chset=NULL; + char *locale_cpy=NULL; + char buf[sizeof(default_chset_buf)]; + + chset=getenv("MM_CHARSET"); + + if (chset == NULL) + chset=getenv("CHARSET"); + + if (chset == NULL) + { +#if HAVE_LOCALE_H +#if HAVE_SETLOCALE + old_locale=setlocale(LC_ALL, ""); + locale_cpy=old_locale ? strdup(old_locale):NULL; +#if USE_LIBCHARSET + chset = locale_charset(); +#elif HAVE_LANGINFO_CODESET + chset=nl_langinfo(CODESET); +#endif +#endif +#endif + } + + memset(buf, 0, sizeof(buf)); + + if (chset && + + /* Map GNU libc iconv oddity to us-ascii */ + + (strcmp(chset, "ANSI_X3.4") == 0 || + strncmp(chset, "ANSI_X3.4-", 10) == 0)) + chset="US-ASCII"; + + if (chset) + { + strncat(buf, chset, sizeof(buf)-1); + } + else + { + const char *p=getenv("LANG"); + + /* LANG is xx_yy.CHARSET@modifier */ + + if (p && *p && (p=strchr(p, '.')) != NULL) + { + const char *q=strchr(++p, '@'); + + if (!q) + q=p+strlen(p); + + if (q-p >= sizeof(buf)-1) + q=p+sizeof(buf)-1; + + memcpy(buf, p, q-p); + buf[q-p]=0; + } + else + strcpy(buf, "US-ASCII"); + } + + memcpy(default_chset_buf, buf, sizeof(buf)); + +#if HAVE_LOCALE_H +#if HAVE_SETLOCALE + if (locale_cpy) + { + setlocale(LC_ALL, locale_cpy); + free(locale_cpy); + } +#endif +#endif + +} + +const char *unicode_default_chset() +{ + if (default_chset_buf[0] == 0) + init_default_chset(); + + return default_chset_buf; +} + + +/*****************************************************************************/ + +const char libmail_u_ucs4_native[]= +#if WORDS_BIGENDIAN + "UCS-4BE" +#else + "UCS-4LE" +#endif + ; + +const char libmail_u_ucs2_native[]= +#if WORDS_BIGENDIAN + "UCS-2BE" +#else + "UCS-2LE" +#endif + ; + +/* A stack of conversion modules */ + +struct libmail_u_convert_hdr { + + int (*convert_handler)(void *ptr, + const char *text, size_t cnt); + int (*deinit_handler)(void *ptr, int *errptr); + void *ptr; + + struct libmail_u_convert_hdr *next; +}; + +/* Decoding table for modified UTF7-encoding as used in imap */ + +static const char mbase64_lookup[]={ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,63,-1,-1,-1, + 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, + -1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, + 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, + -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; + +static const char mbase64[]= + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; + +/* +** Conversion wrapper for converting to modified-utf7 IMAP encoding. +** +** This is done by converting to UCS2, then stacking on a module that +** takes that and converts UCS2 to modified-UTF7. +** +** init_nottoimaputf7() returns an opaque stack for converting to ucs2. +*/ + +static libmail_u_convert_handle_t +init_nottoimaputf7(const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg); + +/* +** The to modified UTF7 module +*/ + +struct libmail_u_convert_toimaputf7 { + + struct libmail_u_convert_hdr hdr; + + /* Accumulated output buffer */ + + char utf7encodebuf[1024]; + size_t utf7encodebuf_cnt; + + /* Accumulated bits for base64 encoding */ + uint32_t utf7bits; + + /* How many bits in utf7bits */ + uint16_t utf7bitcount; + + /* Flag: in base64mode */ + uint16_t utfmode; + + int errflag; + + /* Any extra characters that should be munged */ + + char smapmunge[16]; + + /* Remembered output function */ + + int (*output_func)(const char *, size_t, void *); + + /* Remembered arg to the output function */ + void *convert_arg; +}; + +/* Macro - flush the output buffer */ +#define toimaputf7_encode_flush(p) do { \ + int rc; \ + \ + rc=(*(p)->output_func)((p)->utf7encodebuf, \ + (p)->utf7encodebuf_cnt, \ + (p)->convert_arg); \ + if (rc) \ + return ((p)->errflag=(rc)); \ + \ + (p)->utf7encodebuf_cnt=0; \ + } while (0) + +static int toimaputf7_encode_flushfinal(struct libmail_u_convert_toimaputf7 *p) +{ + if (p->utf7encodebuf_cnt > 0) + toimaputf7_encode_flush(p); + return 0; +} + +/* Macro - add one char to the output buffer */ + +#define toimaputf7_encode_add(p,c) do { \ + if ((p)->utf7encodebuf_cnt >= sizeof((p)->utf7encodebuf)) \ + toimaputf7_encode_flush((p)); \ + \ + (p)->utf7encodebuf[(p)->utf7encodebuf_cnt++]=(c); \ + } while (0); + +static int deinit_toimaputf7(void *ptr, int *errptr); + +static int do_convert_toutf7(const char *text, size_t cnt, void *arg); +static int convert_utf7_handler(void *ptr, const char *text, size_t cnt); + +/* +** Create a conversion module stack +*/ + +libmail_u_convert_handle_t +libmail_u_convert_init(const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg) +{ + struct libmail_u_convert_toimaputf7 *toutf7; + libmail_u_convert_handle_t h; + const char *smapmunge; + size_t l=strlen(unicode_x_imap_modutf7); + + if (strncmp(dst_chset, unicode_x_imap_modutf7, l) == 0 && + (dst_chset[l] == 0 || dst_chset[l] == ' ')) + { + smapmunge=dst_chset + l; + + if (*smapmunge) + ++smapmunge; + } + else + return init_nottoimaputf7(src_chset, dst_chset, + output_func, + convert_arg); + + toutf7=malloc(sizeof(struct libmail_u_convert_toimaputf7)); + + if (!toutf7) + return NULL; + + memset(toutf7, 0, sizeof(*toutf7)); + + h=init_nottoimaputf7(src_chset, libmail_u_ucs2_native, + do_convert_toutf7, toutf7); + if (!h) + { + free(toutf7); + return (NULL); + } + + toutf7->output_func=output_func; + toutf7->convert_arg=convert_arg; + + strncat(toutf7->smapmunge, smapmunge, sizeof(toutf7->smapmunge)-1); + + toutf7->hdr.convert_handler=convert_utf7_handler; + toutf7->hdr.deinit_handler=deinit_toimaputf7; + toutf7->hdr.ptr=toutf7; + toutf7->hdr.next=h; + return &toutf7->hdr; +} + +/* Passthrough to the wrapped stack */ + +static int convert_utf7_handler(void *ptr, const char *text, size_t cnt) +{ + struct libmail_u_convert_toimaputf7 *toutf7= + (struct libmail_u_convert_toimaputf7 *)ptr; + + return (*toutf7->hdr.next->convert_handler)(toutf7->hdr.next->ptr, + text, cnt); +} + +static int utf7off(struct libmail_u_convert_toimaputf7 *toutf7) +{ + if (!toutf7->utfmode) + return 0; + toutf7->utfmode=0; + + if (toutf7->utf7bitcount > 0) + toimaputf7_encode_add(toutf7, + mbase64[(toutf7->utf7bits + << (6-toutf7->utf7bitcount)) + & 63]); + toimaputf7_encode_add(toutf7, '-'); + return 0; +} + + +static int do_convert_toutf7(const char *text, size_t cnt, void *arg) +{ + struct libmail_u_convert_toimaputf7 *toutf7= + (struct libmail_u_convert_toimaputf7 *)arg; + + /* We better be getting UCS-2 here! */ + + const uint16_t *utext=(const uint16_t *)text; + cnt /= 2; + + while (cnt) + { + if (toutf7->errflag) + return toutf7->errflag; + + if (*utext >= 0x20 && *utext <= 0x7F + && strchr( toutf7->smapmunge, (char)*utext) == NULL) + + /* + && (!toutf7->smapmunge || (*utext != '.' && *utext != '/' && + *utext != '~' && *utext != ':'))) + */ + { + if (utf7off(toutf7)) + return toutf7->errflag; + + toimaputf7_encode_add(toutf7, *utext); + + if (*utext == '&') + toimaputf7_encode_add(toutf7, '-'); + + ++utext; + --cnt; + continue; + } + + if (!toutf7->utfmode) + { + toutf7->utfmode=1; + toutf7->utf7bitcount=0; + toimaputf7_encode_add(toutf7, '&'); + continue; + } + + toutf7->utf7bits = (toutf7->utf7bits << 16) | + (((uint32_t)*utext) & 0xFFFF); + toutf7->utf7bitcount += 16; + + ++utext; + --cnt; + + /* If there's at least 6 bits, output base64-encoded char */ + + while (toutf7->utf7bitcount >= 6) + { + uint32_t v; + int n; + + if (toutf7->errflag) + return toutf7->errflag; + + v=toutf7->utf7bits; + n=toutf7->utf7bitcount-6; + toutf7->utf7bitcount -= 6; + + if (n > 0) + v >>= n; + + toimaputf7_encode_add(toutf7, mbase64[v & 63]); + } + } + + return 0; +} + +static int deinit_toimaputf7(void *ptr, int *errptr) +{ + int rc; + + struct libmail_u_convert_toimaputf7 *toutf7= + (struct libmail_u_convert_toimaputf7 *)ptr; + + /* Flush out the downstream stack */ + rc=(*toutf7->hdr.next->deinit_handler)(toutf7->hdr.next->ptr, errptr); + + /* Make sure we're out of modified base64 */ + + if (rc == 0) + rc=utf7off(toutf7); + + if (rc == 0 && toutf7->utf7encodebuf_cnt > 0) + rc=toimaputf7_encode_flushfinal(toutf7); + + free(toutf7); + return rc; +} + +/************/ + +/* +** Convert from modified-utf7 IMAP encoding. +** +** This module converts it to UCS-2, then this is attached to a stack that +** converts UCS-2 to the requested charset. +*/ + +static libmail_u_convert_handle_t +init_notfromimaputf7(const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg); + +struct libmail_u_convert_fromimaputf7 { + + struct libmail_u_convert_hdr hdr; + + /* Accumulated UCS-2 stream */ + uint16_t convbuf[512]; + size_t convbuf_cnt; + + /* Accumulated base64 bits */ + uint32_t modbits; + + /* How many bits extracted from a base64 stream */ + + short modcnt; + + /* Flag: seen the & */ + char seenamp; + + /* Flag: seen the &, and the next char wasn't - */ + + char inmod; + int errflag; + int converr; +}; + +/* Flush the accumulated UCS-2 stream */ + +#define convert_fromutf7_flush(p) do { \ + (p)->errflag=(*(p)->hdr.next->convert_handler) \ + ((p)->hdr.next->ptr, \ + (const char *)(p)->convbuf, \ + (p)->convbuf_cnt * \ + sizeof((p)->convbuf[0])); \ + (p)->convbuf_cnt=0; \ + } while (0) + +/* Accumulated a UCS-2 char */ + +#define convert_fromutf7_add(p,c) do { \ + if ((p)->convbuf_cnt >= \ + sizeof((p)->convbuf)/sizeof((p)->convbuf[0])) \ + convert_fromutf7_flush((p)); \ + (p)->convbuf[(p)->convbuf_cnt++]=(c); \ + } while (0) + + +static int convert_fromutf7(void *ptr, + const char *text, size_t cnt); +static int deinit_fromutf7(void *ptr, int *errptr); + +static libmail_u_convert_handle_t +init_nottoimaputf7(const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg) +{ + struct libmail_u_convert_fromimaputf7 *fromutf7; + libmail_u_convert_handle_t h; + size_t l=strlen(unicode_x_imap_modutf7); + + if (strncmp(src_chset, unicode_x_imap_modutf7, l) == 0 && + (src_chset[l] == 0 || src_chset[l] == ' ')) + ; + else + return init_notfromimaputf7(src_chset, dst_chset, + output_func, + convert_arg); + + fromutf7=(struct libmail_u_convert_fromimaputf7 *) + malloc(sizeof(struct libmail_u_convert_fromimaputf7)); + + if (!fromutf7) + return NULL; + + memset(fromutf7, 0, sizeof(*fromutf7)); + + /* Create a stack for converting UCS-2 to the dest charset */ + + h=init_notfromimaputf7(libmail_u_ucs2_native, dst_chset, + output_func, convert_arg); + + if (!h) + { + free(fromutf7); + return (NULL); + } + + fromutf7->hdr.next=h; + fromutf7->hdr.convert_handler=convert_fromutf7; + fromutf7->hdr.deinit_handler=deinit_fromutf7; + fromutf7->hdr.ptr=fromutf7; + return &fromutf7->hdr; +} + +static int convert_fromutf7(void *ptr, + const char *text, size_t cnt) +{ + struct libmail_u_convert_fromimaputf7 *fromutf7= + (struct libmail_u_convert_fromimaputf7 *)ptr; + int bits; + + while (cnt) + { + if (fromutf7->errflag) + return fromutf7->errflag; + + if (!fromutf7->seenamp && *text == '&') + { + fromutf7->seenamp=1; + fromutf7->inmod=0; + fromutf7->modcnt=0; + ++text; + --cnt; + continue; + } + + if (fromutf7->seenamp) + { + if (*text == '-') + { + convert_fromutf7_add(fromutf7, '&'); + ++text; + --cnt; + fromutf7->seenamp=0; + continue; + } + fromutf7->seenamp=0; + fromutf7->inmod=1; + } + + if (!fromutf7->inmod) + { + /* Not in the base64 encoded stream */ + + convert_fromutf7_add(fromutf7, + ((uint16_t)*text) & 0xFFFF); + ++text; + --cnt; + continue; + } + + if (*text == '-') + { + /* End of the base64 encoded stream */ + fromutf7->inmod=0; + ++text; + --cnt; + continue; + } + + /* Got 6 more bits */ + + bits=mbase64_lookup[(unsigned char)*text]; + + ++text; + --cnt; + + if (bits < 0) + { + errno=EILSEQ; + return fromutf7->errflag=-1; + } + + fromutf7->modbits = (fromutf7->modbits << 6) | bits; + fromutf7->modcnt += 6; + + if (fromutf7->modcnt >= 16) + { + /* Got a UCS-2 char */ + + int shiftcnt=fromutf7->modcnt - 16; + uint32_t v=fromutf7->modbits; + + if (shiftcnt) + v >>= shiftcnt; + + fromutf7->modcnt -= 16; + + convert_fromutf7_add(fromutf7, v); + } + } + return 0; +} + +static int deinit_fromutf7(void *ptr, int *errptr) +{ + struct libmail_u_convert_fromimaputf7 *fromutf7= + (struct libmail_u_convert_fromimaputf7 *)ptr; + int rc; + + if (fromutf7->seenamp || fromutf7->inmod) + { + if (fromutf7->errflag == 0) + { + fromutf7->errflag= -1; + errno=EILSEQ; + } + } + + if (fromutf7->convbuf_cnt) + convert_fromutf7_flush(fromutf7); + + rc=fromutf7->hdr.next->deinit_handler(fromutf7->hdr.next->ptr, errptr); + + if (fromutf7->errflag && rc == 0) + rc=fromutf7->errflag; + + if (errptr && fromutf7->converr) + *errptr=1; + + free(fromutf7); + return rc; +} + +/************/ + +/* A real conversion module, via iconv */ + +struct libmail_u_convert_iconv { + + struct libmail_u_convert_hdr hdr; + + iconv_t h; + int errflag; /* Accumulated errors */ + + int (*output_func)(const char *, size_t, void *); + void *convert_arg; + + char buffer[1024]; /* Input buffer */ + size_t bufcnt; /* Accumulated input in buffer */ + char skipcnt; /* Skip this many bytes upon encountering EILSEQ */ + char skipleft; /* How many bytes are currently left to skip */ + char converr; /* Flag - an EILSEQ was encountered */ +} ; + +static int init_iconv(struct libmail_u_convert_iconv *h, + const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg); + +static libmail_u_convert_handle_t +init_notfromimaputf7(const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg) +{ + + + struct libmail_u_convert_iconv *h= + malloc(sizeof(struct libmail_u_convert_iconv)); + + if (!h) + return NULL; + + memset(h, 0, sizeof(*h)); + + if (init_iconv(h, src_chset, dst_chset, output_func, convert_arg)) + { + free(h); + return NULL; + } + return &h->hdr; +} + +/* Run the stack */ + +int libmail_u_convert(libmail_u_convert_handle_t h, + const char *text, size_t cnt) +{ + return (*h->convert_handler)(h->ptr, text, cnt); +} + +/* Destroy the stack */ + +int libmail_u_convert_deinit(libmail_u_convert_handle_t h, int *errptr) +{ + return (*h->deinit_handler)(h, errptr); +} + +static int deinit_iconv(void *ptr, int *errptr); +static int convert_iconv(void *ptr, + const char *text, size_t cnt); + +/* Initialize a single conversion module, in the stack */ + +static int init_iconv(struct libmail_u_convert_iconv *h, + const char *src_chset, + const char *dst_chset, + int (*output_func)(const char *, size_t, void *), + void *convert_arg) +{ + if ((h->h=iconv_open(dst_chset, src_chset)) == (iconv_t)-1) + return -1; + + h->hdr.convert_handler=convert_iconv; + h->hdr.deinit_handler=deinit_iconv; + h->hdr.ptr=h; + + h->output_func=output_func; + h->convert_arg=convert_arg; + + /* Heuristically determine how many octets to skip upon an EILSEQ */ + + h->skipcnt=1; + switch (src_chset[0]) { + case 'u': + case 'U': + switch (src_chset[1]) { + case 'c': + case 'C': + switch (src_chset[2]) { + case 's': + case 'S': + if (src_chset[3] == '-') + switch (src_chset[4]) { + case '4': + /* UCS-4 */ + h->skipcnt=4; + break; + case '2': + /* UCS-2 */ + h->skipcnt=2; + break; + } + } + break; + case 't': + case 'T': + switch (src_chset[2]) { + case 'f': + case 'F': + if (src_chset[3] == '-') + switch (src_chset[4]) { + case '3': + /* UTF-32 */ + h->skipcnt=4; + break; + case '1': + /* UTF-16 */ + h->skipcnt=2; + break; + } + } + } + } + + return 0; +} + +static void convert_flush(struct libmail_u_convert_iconv *); +static void convert_flush_iconv(struct libmail_u_convert_iconv *, const char **, + size_t *); + +/* +** iconv conversion module. Accumulate input in an input buffer. When the +** input buffer is full, invoke convert_flush(). +*/ + +static int convert_iconv(void *ptr, + const char *text, size_t cnt) +{ + struct libmail_u_convert_iconv *h=(struct libmail_u_convert_iconv *)ptr; + + while (cnt && h->errflag == 0) + { + if (h->bufcnt >= sizeof(h->buffer)-1) + { + convert_flush(h); + + if (h->errflag) + break; + } + + h->buffer[h->bufcnt++]= *text++; + --cnt; + } + + return h->errflag; +} + +/* +** Finish an iconv conversion module. Invoke convert_flush() to flush any +** buffered input. Invoke convert_flush_iconv() to return state to the initial +** conversion state. +*/ + +static int deinit_iconv(void *ptr, int *errptr) +{ + int rc; + int converr; + struct libmail_u_convert_iconv *h=(struct libmail_u_convert_iconv *)ptr; + libmail_u_convert_handle_t next; + + if (h->errflag == 0) + convert_flush(h); + + if (h->bufcnt && h->errflag == 0) + h->converr=1; + + if (h->errflag == 0) + convert_flush_iconv(h, NULL, NULL); + + rc=h->errflag; + converr=h->converr != 0; + iconv_close(h->h); + next=h->hdr.next; + free(h); + if (errptr) + *errptr=converr; + + /* If there's another module in the stack, clean that up */ + + if (next) + { + int converrnext; + int rcnext=libmail_u_convert_deinit(next, &converrnext); + + if (converrnext && errptr && *errptr == 0) + *errptr=converr; + + if (rcnext && rc == 0) + rc=rcnext; + } + return rc; +} + +/* +** Invoke convert_flush_iconv() to flush the input buffer. If there's +** unconverted text remaining, reposition it at the beginning of the input +** buffer. +*/ + +static void convert_flush(struct libmail_u_convert_iconv *h) +{ + const char *p; + size_t n; + + if (h->bufcnt == 0 || h->errflag) + return; + + p=h->buffer; + n=h->bufcnt; + + convert_flush_iconv(h, &p, &n); + + if (h->errflag) + return; + + if (h->bufcnt == n) + n=0; /* Unexpected error, dunno what to do, punt */ + + h->bufcnt=0; + + while (n) + { + h->buffer[h->bufcnt]= *p; + + ++h->bufcnt; + ++p; + --n; + } +} + +/* +** Convert text via iconv. +*/ + +static void convert_flush_iconv(struct libmail_u_convert_iconv *h, + const char **inbuf, size_t *inbytesleft) +{ + int save_errno; + + while (1) + { + char outbuf[1024]; + char *outp; + size_t outleft; + size_t n; + size_t origin=0; + + if (inbytesleft) + { + if ((origin=*inbytesleft) == 0) + return; + + if (inbuf && h->skipleft && origin) + { + /* Skipping after an EILSEQ */ + + --h->skipleft; + --*inbytesleft; + ++*inbuf; + continue; + } + + } + + if (h->errflag) + { + /* Quietly eat everything after a previous error */ + + if (inbytesleft) + *inbytesleft=0; + + return; + } + + outp=outbuf; + outleft=sizeof(outbuf); + + n=iconv(h->h, (char **)inbuf, inbytesleft, &outp, &outleft); + + save_errno=errno; + + /* Anything produced by iconv() gets pushed down the stack */ + + if (outp > outbuf) + { + int rc=(*h->output_func)(outbuf, outp-outbuf, + h->convert_arg); + if (rc) + { + h->errflag=rc; + return; + } + } + + if (n != (size_t)-1) + { + /* iconv(3) reason #2 */ + + break; + } + + if (inbytesleft == 0) + { + /* + ** An error when generating the shift sequence to + ** return to the initial state. We don't know what to + ** do, now. + */ + + errno=EINVAL; + h->errflag= -1; + return; + } + + /* + ** convert_flush() gets invoked when the 1024 char input buffer + ** fills or to convert input that has been buffered when + ** convert_chset_end() gets invoked. + ** + ** A return code of EINVAL from iconv() is iconv() encountering + ** an incomplete multibyte sequence. + ** + ** If iconv() failed without consuming any input: + ** + ** - iconv(3) reason #1, EILSEQ, invalid multibyte sequence + ** that starts at the beginning of the string we wish to + ** convert. Discard one character, and try again. + ** + ** - iconv(3) reason #3, EINVAL, incomplete multibyte sequence. + ** If it's possible to have an incomplete 1024 character long + ** multibyte sequence, we're in trouble. Or we've encountered + ** an EINVAL when flushing out the remaining buffered input, + ** in convert_chset_end(). In either case, it's ok to sicard + ** one character at a time, until we either reach the end, + ** or get some other result. + ** + ** - iconv(3) reason #4, E2BIG. If the 1024 character output + ** buffer, above, is insufficient to produce the output from a + ** single converted character, we're in trouble. + */ + + if (*inbytesleft == origin) + { + h->skipleft=h->skipcnt; + h->converr=1; + } + + /* + ** Stopped at an incomplete multibyte sequence, try again on + ** the next round. + */ + else if (save_errno == EINVAL) + break; + + if (save_errno == EILSEQ) + h->converr=1; /* Another possibility this can happen */ + + /* + ** If we get here because of iconv(3) reason #4, filled out + ** the output buffer, we should continue with the conversion. + ** Otherwise, upon encountering any other error condition, + ** reset the conversion state. + */ + if (save_errno != E2BIG) + iconv(h->h, NULL, NULL, NULL, NULL); + } +} + +/*****************************************************************************/ + +/* +** A wrapper for libmail_u_convert() that collects the converted character +** text into a buffer. This is done by passing an output function to +** libmail_u_convert() that saves converted text in a linked-list +** of buffers. +** +** Then, in the deinitialization function, the buffers get concatenated into +** the final character buffer. +*/ + +struct libmail_u_convert_cbuf { + struct libmail_u_convert_cbuf *next; + char *fragment; + size_t fragment_size; +}; + +struct libmail_u_convert_tocbuf { + struct libmail_u_convert_hdr hdr; + + char **cbufptr_ret; + size_t *cbufsize_ret; + int errflag; + size_t tot_size; + int nullterminate; + + struct libmail_u_convert_cbuf *first, **last; +}; + +static int save_tocbuf(const char *, size_t, void *); +static int convert_tocbuf(void *ptr, + const char *text, size_t cnt); +static int deinit_tocbuf(void *ptr, int *errptr); + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_init(const char *src_chset, + const char *dst_chset, + char **cbufptr_ret, + size_t *cbufsize_ret, + int nullterminate + ) +{ + struct libmail_u_convert_tocbuf *p= + malloc(sizeof(struct libmail_u_convert_tocbuf)); + libmail_u_convert_handle_t h; + + if (!p) + return NULL; + + memset(p, 0, sizeof(*p)); + + h=libmail_u_convert_init(src_chset, dst_chset, save_tocbuf, p); + + if (!h) + { + free(p); + return NULL; + } + + p->cbufptr_ret=cbufptr_ret; + p->cbufsize_ret=cbufsize_ret; + p->last= &p->first; + p->nullterminate=nullterminate; + p->hdr.next=h; + p->hdr.convert_handler=convert_tocbuf; + p->hdr.deinit_handler=deinit_tocbuf; + p->hdr.ptr=p; + return &p->hdr; +} + +/* Capture the output of the conversion stack */ + +static int save_tocbuf(const char *text, size_t cnt, void *ptr) +{ + struct libmail_u_convert_tocbuf *p= + (struct libmail_u_convert_tocbuf *)ptr; + struct libmail_u_convert_cbuf *fragment= + malloc(sizeof(struct libmail_u_convert_cbuf)+cnt); + size_t tot_size; + + if (!fragment) + { + p->errflag=1; + return 1; + } + + fragment->next=NULL; + fragment->fragment=(char *)(fragment+1); + if ((fragment->fragment_size=cnt) > 0) + memcpy(fragment->fragment, text, cnt); + + *(p->last)=fragment; + p->last=&fragment->next; + + tot_size=p->tot_size + cnt; /* Keep track of the total size saved */ + + if (tot_size < p->tot_size) /* Overflow? */ + { + errno=E2BIG; + return 1; + } + p->tot_size=tot_size; + return 0; +} + +/* Punt converted text down the stack */ + +static int convert_tocbuf(void *ptr, const char *text, size_t cnt) +{ + struct libmail_u_convert_tocbuf *p= + (struct libmail_u_convert_tocbuf *)ptr; + + return libmail_u_convert(p->hdr.next, text, cnt); +} + +/* +** Destroy the conversion stack. Destroy the downstream, then assemble the +** final array. +*/ + +static int deinit_tocbuf(void *ptr, int *errptr) +{ + struct libmail_u_convert_tocbuf *p= + (struct libmail_u_convert_tocbuf *)ptr; + int rc=libmail_u_convert_deinit(p->hdr.next, errptr); + struct libmail_u_convert_cbuf *bufptr; + + if (rc == 0 && p->nullterminate) + { + char zero=0; + + rc=save_tocbuf( &zero, sizeof(zero), p->hdr.ptr); + } + + if (rc == 0) + { + if (((*p->cbufptr_ret)=malloc(p->tot_size ? p->tot_size:1)) != + NULL) + { + size_t i=0; + + for (bufptr=p->first; bufptr; bufptr=bufptr->next) + { + if (bufptr->fragment_size) + memcpy(&(*p->cbufptr_ret)[i], + bufptr->fragment, + bufptr->fragment_size); + i += bufptr->fragment_size; + } + (*p->cbufsize_ret)=i; + } + else + { + rc= -1; + } + } + + for (bufptr=p->first; bufptr; ) + { + struct libmail_u_convert_cbuf *b=bufptr; + + bufptr=bufptr->next; + + free(b); + } + free(p); + + return rc; +} + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_toutf8_init(const char *src_chset, + char **cbufptr_ret, + size_t *cbufsize_ret, + int nullterminate + ) +{ + return libmail_u_convert_tocbuf_init(src_chset, "utf-8", + cbufptr_ret, cbufsize_ret, + nullterminate); +} + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_fromutf8_init(const char *dst_chset, + char **cbufptr_ret, + size_t *cbufsize_ret, + int nullterminate + ) +{ + return libmail_u_convert_tocbuf_init("utf-8", dst_chset, + cbufptr_ret, cbufsize_ret, + nullterminate); +} + +char *libmail_u_convert_toutf8(const char *text, + const char *charset, + int *error) +{ + char *cbufptr; + size_t cbufsize; + libmail_u_convert_handle_t h= + libmail_u_convert_tocbuf_toutf8_init(charset, + &cbufptr, + &cbufsize, 1); + + if (!h) + return NULL; + + libmail_u_convert(h, text, strlen(text)); + + if (libmail_u_convert_deinit(h, error) == 0) + return cbufptr; + + return NULL; +} + +char *libmail_u_convert_fromutf8(const char *text, + const char *charset, + int *error) +{ + char *cbufptr; + size_t cbufsize; + libmail_u_convert_handle_t h= + libmail_u_convert_tocbuf_fromutf8_init(charset, + &cbufptr, + &cbufsize, 1); + + if (!h) + return NULL; + + libmail_u_convert(h, text, strlen(text)); + + if (libmail_u_convert_deinit(h, error) == 0) + return cbufptr; + + return NULL; +} + +char *libmail_u_convert_tobuf(const char *text, + const char *charset, + const char *dstcharset, + int *error) +{ + char *cbufptr; + size_t cbufsize; + libmail_u_convert_handle_t h= + libmail_u_convert_tocbuf_init(charset, + dstcharset, + &cbufptr, + &cbufsize, 1); + + if (!h) + return NULL; + + libmail_u_convert(h, text, strlen(text)); + + if (libmail_u_convert_deinit(h, error) == 0) + return cbufptr; + + return NULL; +} + +/*****************************************************************************/ + +/* +** Convert text to unicode_chars. Same basic approach as +** libmail_u_convert_tocbuf_init(). The output character set gets specified +** as UCS-4, the final output size is divided by 4, and the output buffer gets +** typed as a unicode_char array. +*/ + +struct libmail_u_convert_buf { + struct libmail_u_convert_buf *next; + unicode_char *fragment; + size_t fragment_size; + size_t max_fragment_size; +}; + +struct libmail_u_convert_tou { + struct libmail_u_convert_hdr hdr; + + unicode_char **ucptr_ret; + size_t *ucsize_ret; + int errflag; + size_t tot_size; + int nullterminate; + + struct libmail_u_convert_buf *first, *tail, **last; +}; + +static int save_unicode(const char *, size_t, void *); +static int convert_tounicode(void *ptr, + const char *text, size_t cnt); +static int deinit_tounicode(void *ptr, int *errptr); + +libmail_u_convert_handle_t +libmail_u_convert_tou_init(const char *src_chset, + unicode_char **ucptr_ret, + size_t *ucsize_ret, + int nullterminate + ) +{ + struct libmail_u_convert_tou *p= + malloc(sizeof(struct libmail_u_convert_tou)); + libmail_u_convert_handle_t h; + + if (!p) + return NULL; + + memset(p, 0, sizeof(*p)); + + h=libmail_u_convert_init(src_chset, libmail_u_ucs4_native, + save_unicode, p); + + if (!h) + { + free(p); + return NULL; + } + + p->ucptr_ret=ucptr_ret; + p->ucsize_ret=ucsize_ret; + p->last= &p->first; + p->nullterminate=nullterminate; + p->hdr.next=h; + p->hdr.convert_handler=convert_tounicode; + p->hdr.deinit_handler=deinit_tounicode; + p->hdr.ptr=p; + return &p->hdr; +} + +libmail_u_convert_handle_t +libmail_u_convert_fromu_init(const char *dst_chset, + char **cbufptr_ret, + size_t *csize_ret, + int nullterminate + ) +{ + return libmail_u_convert_tocbuf_init(libmail_u_ucs4_native, + dst_chset, + cbufptr_ret, + csize_ret, + nullterminate); +} + +int libmail_u_convert_uc(libmail_u_convert_handle_t handle, + const unicode_char *text, + size_t cnt) +{ + return libmail_u_convert(handle, (const char *)text, + cnt * sizeof(*text)); +} + +/* Capture the output of the conversion stack */ + +static int save_unicode(const char *text, size_t cnt, void *ptr) +{ + struct libmail_u_convert_tou *p= + (struct libmail_u_convert_tou *)ptr; + struct libmail_u_convert_buf *fragment; + size_t tot_size; + + cnt /= sizeof(unicode_char); + + tot_size=p->tot_size + cnt*sizeof(unicode_char); + /* Keep track of the total size saved */ + + if (p->tail) + { + size_t n=p->tail->max_fragment_size-p->tail->fragment_size; + + if (n > cnt) + n=cnt; + + if (n) + { + memcpy(p->tail->fragment+p->tail->fragment_size, + text, n*sizeof(unicode_char)); + + cnt -= n; + text += n*sizeof(unicode_char); + p->tail->fragment_size += n; + } + } + + if (cnt > 0) + { + size_t cnt_alloc=cnt; + + if (cnt_alloc < 16) + cnt_alloc=16; + + if ((fragment=malloc(sizeof(struct libmail_u_convert_buf) + +cnt_alloc*sizeof(unicode_char))) + == NULL) + { + p->errflag=1; + return 1; + } + + fragment->next=NULL; + fragment->fragment=(unicode_char *)(fragment+1); + fragment->max_fragment_size=cnt_alloc; + fragment->fragment_size=cnt; + memcpy(fragment->fragment, text, cnt*sizeof(unicode_char)); + + *(p->last)=fragment; + p->last=&fragment->next; + p->tail=fragment; + } + + if (tot_size < p->tot_size) /* Overflow? */ + { + errno=E2BIG; + return 1; + } + p->tot_size=tot_size; + return 0; +} + +/* Punt converted text down the stack */ + +static int convert_tounicode(void *ptr, + const char *text, size_t cnt) +{ + struct libmail_u_convert_tou *p= + (struct libmail_u_convert_tou *)ptr; + + return libmail_u_convert(p->hdr.next, text, cnt); +} + +/* +** Destroy the conversion stack. Destroy the downstream, then assemble the +** final array. +*/ + +static int deinit_tounicode(void *ptr, int *errptr) +{ + struct libmail_u_convert_tou *p= + (struct libmail_u_convert_tou *)ptr; + int rc=libmail_u_convert_deinit(p->hdr.next, errptr); + struct libmail_u_convert_buf *bufptr; + + if (rc == 0 && p->nullterminate) + { + unicode_char zero=0; + + rc=save_unicode( (const char *)&zero, sizeof(zero), + p->hdr.ptr); + } + + if (rc == 0) + { + if (((*p->ucptr_ret)=malloc(p->tot_size ? p->tot_size:1)) != + NULL) + { + size_t i=0; + + for (bufptr=p->first; bufptr; bufptr=bufptr->next) + { + if (bufptr->fragment_size) + memcpy(&(*p->ucptr_ret)[i], + bufptr->fragment, + bufptr->fragment_size + *sizeof(*bufptr->fragment)); + i += bufptr->fragment_size; + } + (*p->ucsize_ret)=i; + } + else + { + rc= -1; + } + } + + for (bufptr=p->first; bufptr; ) + { + struct libmail_u_convert_buf *b=bufptr; + + bufptr=bufptr->next; + + free(b); + } + free(p); + + return rc; +} + +int libmail_u_convert_tou_tobuf(const char *text, + size_t text_l, + const char *charset, + unicode_char **uc, + size_t *ucsize, + int *err) +{ + libmail_u_convert_handle_t h; + + if ((h=libmail_u_convert_tou_init(charset, uc, ucsize, 0)) == NULL) + return -1; + + if (libmail_u_convert(h, text, text_l) < 0) + { + libmail_u_convert_deinit(h, NULL); + return -1; + } + + if (libmail_u_convert_deinit(h, err)) + return -1; + + return 0; +} + +int libmail_u_convert_fromu_tobuf(const unicode_char *utext, + size_t utext_l, + const char *charset, + char **c, + size_t *csize, + int *err) +{ + libmail_u_convert_handle_t h; + + if (utext_l == (size_t)-1) + { + for (utext_l=0; utext[utext_l]; ++utext_l) + ; + } + + if ((h=libmail_u_convert_fromu_init(charset, c, csize, 1)) == NULL) + return -1; + + if (libmail_u_convert_uc(h, utext, utext_l) < 0) + { + libmail_u_convert_deinit(h, NULL); + return -1; + } + + if (libmail_u_convert_deinit(h, err)) + return -1; + + return 0; +} + +char *libmail_u_convert_tocase(const char *str, + const char *charset, + unicode_char (*first_char_func)(unicode_char), + unicode_char (*char_func)(unicode_char)) +{ + unicode_char *uc; + size_t ucsize; + size_t i; + int err; + char *c; + size_t csize; + + if (libmail_u_convert_tou_tobuf(str, strlen(str), + charset, &uc, &ucsize, &err)) + return NULL; + + if (err) + { + free(uc); + return NULL; + } + + for (i=0; i<ucsize; ++i) + { + uc[i]=(*first_char_func)(uc[i]); + + if (char_func) + first_char_func=char_func; + } + + if (libmail_u_convert_fromu_tobuf(uc, ucsize, + charset, + &c, &csize, &err)) + { + free(uc); + return NULL; + } + + free(uc); + + if (err) + { + free(c); + return NULL; + } + + return c; +} diff --git a/unicode/unicode.h b/unicode/unicode.h new file mode 100644 index 0000000..4e018b7 --- /dev/null +++ b/unicode/unicode.h @@ -0,0 +1,1692 @@ +#ifndef unicode_h +#define unicode_h + +/* +** Copyright 2000-2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#ifdef __cplusplus + +#include <string> +#include <vector> +#include <list> + +extern "C" { +#endif + +#if 0 +} +#endif + +#include "unicode/unicode_config.h" + +#include <stdlib.h> + +#include <stdio.h> +#if HAVE_WCHAR_H +#include <wchar.h> +#endif + +#if HAVE_STDDEF_H +#include <stddef.h> +#endif +#include <stdint.h> + +#include <sys/types.h> + +typedef uint32_t unicode_char; + +/* +** The system default character set, from the locale. +*/ + +extern const char *unicode_default_chset(); + +/* Unicode upper/lower/title case conversion functions */ + +extern unicode_char unicode_uc(unicode_char); +extern unicode_char unicode_lc(unicode_char); +extern unicode_char unicode_tc(unicode_char); + +/* +** Look up HTML 4.0/XHTML entity. +** +** n="amp", etc... +** +** Returns the unicode entity value, or 0 if no such entity is defined. +*/ + +unicode_char unicode_html40ent_lookup(const char *n); + +/* +** +** Return "width" of unicode character. +** +** This is defined as follows: for characters having the F or W property in +** tr11 (EastAsianWidth), unicode_wcwidth() returns 2. +** +** Otherwise, characters having the BK, CR, LF, CM, NL, WJ, and ZW line +** breaking property as per tr14, unicode_wcwdith() returns 0. For all other +** cases, 1. +** +** This provides a rough estimate of the "width" of the character if its +** shown on a text console. +*/ + +extern int unicode_wcwidth(unicode_char c); +extern size_t unicode_wcwidth_str(const unicode_char *c); + +/* +** The unicode-ish isspace() +*/ +extern int unicode_isspace(unicode_char ch); + +/* Internal unicode table lookup function */ + +extern uint8_t unicode_tab_lookup(unicode_char ch, + const size_t *unicode_indextab, + size_t unicode_indextab_sizeof, + const uint8_t (*unicode_rangetab)[2], + const uint8_t *unicode_classtab, + uint8_t uclass); + +/* +** Implementation of grapheme cluster boundary rules, as per tr29, +** including GB9a and GB9b. +** +** Returns non-zero if there's a grapheme break between the two referenced +** characters. +*/ + +int unicode_grapheme_break(unicode_char a, unicode_char b); + +/* +** Implementation of line break rules, as per tr14. +** +** Invoke unicode_lb_init() to initialize the linebreaking algorithm. The +** first parameter is a callback function that gets invoked with two +** arguments: UNICODE_LB_{MANDATORY|NONE|ALLOWED}, and a passthrough argument. +** The second parameter to unicode_lb_init() is the opaque passthrough +** pointer, that is passed as the second argument to the callback function +** with no further interpretation. +** +** unicode_lb_init() returns an opaque handle. Invoke unicode_lb_next(), +** passing the handle and one unicode character. Repeatedly invoke +** unicode_lb_next() to specify the input string for the linebreaking +** algorithm, then invoke unicode_lb_end() to finish calculating the +** linebreaking algorithm, and deallocate the opaque linebreaking handle. +** +** The callback function gets invoked once for each invocation of +** unicode_lb_next(). The contract is that before unicode_lb_end() returns, +** the callback function will get invoked the exact number of times that +** unicode_lb_next(), as long as each invocation of the callback function +** returned 0; nothing more, nothing less. The first parameter to the callback +** function will be one of the following values: +** +** UNICODE_LB_MANDATORY - a linebreak is MANDATORY before the corresponding +** character. +** UNICODE_LB_NONE - a linebreak is PROHIBITED before the corresponding +** character. +** UNICODE_LB_ALLOWED - a linebreak is OPTIONAL before the corresponding +** character (the preceding character is a space, or an equivalent). +** +** The callback function should return 0. A non-zero value indicates an +** error, which gets propagated up to the caller. The contract that the +** callback function gets invoked the same number of times that +** unicode_lb_next() gets invoked is now broken. +*/ + +#define UNICODE_LB_MANDATORY -1 +#define UNICODE_LB_NONE 0 +#define UNICODE_LB_ALLOWED 1 + +struct unicode_lb_info; + +typedef struct unicode_lb_info *unicode_lb_info_t; + +/* +** Allocate a linebreaking handle. +*/ +extern unicode_lb_info_t unicode_lb_init(int (*cb_func)(int, void *), + void *cb_arg); + +/* +** Feed the next character through the linebreaking algorithm. +** A non-zero return code indicates that the callback function was invoked +** and it returned a non-zero return code (which is propagated as a return +** value). unicode_lb_end() must still be invoked, in this case. +** +** A zero return code indicates that if the callback function was invoked, +** it returned 0. +*/ + +extern int unicode_lb_next(unicode_lb_info_t i, unicode_char ch); + +/* +** Convenience function that invokes unicode_lb_next() with a list of +** unicode chars. Returns 0 if all invocations of unicode_lb_next() returned +** 0, or the first non-zero return value from unicode_lb_next(). +*/ + +extern int unicode_lb_next_cnt(unicode_lb_info_t i, + const unicode_char *chars, + size_t cnt); + +/* +** Finish the linebreaking algorithm. +** +** A non-zero return code indicates that the callback function was invoked +** and it returned a non-zero return code (which is propagated as a return +** value). +** +** A zero return code indicates that if the callback function was invoked, +** it returned 0, and that the callback function was invoked exactly the same +** number of times that unicode_lb_next() was invoked. +** +** In all case, the linebreak handle will no longer be valid when this +** function returns. +*/ + +extern int unicode_lb_end(unicode_lb_info_t i); + +/* +** An alternative linebreak API where the callback function receives the +** original unicode character in addition to its linebreak value. +** +** User unicode_lbc_init(), unicode_lbc_next(), and unicode_lbc_end(), whose +** semantics are the same as their _lb_ counterparts. +*/ + +struct unicode_lbc_info; + +typedef struct unicode_lbc_info *unicode_lbc_info_t; + +extern unicode_lbc_info_t unicode_lbc_init(int (*cb_func)(int, unicode_char, + void *), + void *cb_arg); +extern int unicode_lbc_next(unicode_lbc_info_t i, unicode_char ch); +extern int unicode_lbc_end(unicode_lbc_info_t i); + +/* +** Set linebreaking options. +** +** OPTIONS SUBJECT TO CHANGE. +*/ + +extern void unicode_lb_set_opts(unicode_lb_info_t i, int opts); + +extern void unicode_lbc_set_opts(unicode_lbc_info_t i, int opts); + +/* +** Tailorization of LB24: Prevent pluses, as in "C++", from breaking. +** +** Adds the following to LB24: +** +** PR x PR +** +** AL x PR +** +** ID x PR +**/ +#define UNICODE_LB_OPT_PRBREAK 0x0001 + + +/* +** Tailored / breaking rules. +** +** Adds the following rule to LB13: +** +** SY x EX +** +** SY x AL +** +** SY x ID +** +** SP ÷ SY, which takes precedence over "x SY". +*/ +#define UNICODE_LB_OPT_SYBREAK 0x0002 + +/* +** Tailored / breaking rules. +** +** This reclassifies U+2013 and U+2014 as class WJ, prohibiting breaks before +** and after mdash and ndash. +*/ +#define UNICODE_LB_OPT_DASHWJ 0x0004 + +/* +** Implemention of word break rules, as per tr29. +** +** Invoke unicode_wb_init() to initialize the wordbreaking algorithm. The +** first parameter is a callback function that gets invoked with two +** arguments: an int flag, and a passthrough argument. The second parameter to +** unicode_wb_init() is the opaque passthrough pointer, that is passed as the +** second argument to the callback function with no further interpretation. +** +** unicode_wb_init() returns an opaque handle. Invoke unicode_wb_next(), +** passing the handle and one unicode character. Repeatedly invoke +** unicode_wb_next() to specify the input string for the wordbreaking +** algorithm, then invoke unicode_wb_end() to finish calculating the +** wordbreaking algorithm, and deallocate the opaque wordbreaking handle. +** +** The callback function gets invoked once for each invocation of +** unicode_wb_next(). The contract is that before unicode_wb_end() returns, +** the callback function will get invoked the exact number of times that +** unicode_wb_next(), as long as each invocation of the callback function +** returned 0; nothing more, nothing less. The first parameter to the callback +** function will be an int. A non-zero value indicates that there is a word +** break between this character and the preceding one. +** +** The callback function should return 0. A non-zero value indicates an +** error, which gets propagated up to the caller. The contract that the +** callback function gets invoked the same number of times that +** unicode_lb_next() gets invoked is now broken. +*/ + +struct unicode_wb_info; + +typedef struct unicode_wb_info *unicode_wb_info_t; + +/* +** Allocate a wordbreaking handle. +*/ +extern unicode_wb_info_t unicode_wb_init(int (*cb_func)(int, void *), + void *cb_arg); + +/* +** Feed the next character through the wordbreaking algorithm. +** A non-zero return code indicates that the callback function was invoked +** and it returned a non-zero return code (which is propagated as a return +** value). unicode_wb_end() must still be invoked, in this case. +** +** A zero return code indicates that if the callback function was invoked, +** it returned 0. +*/ + +extern int unicode_wb_next(unicode_wb_info_t i, unicode_char ch); + +/* +** Convenience function that invokes unicode_wb_next() with a list of +** unicode chars. Returns 0 if all invocations of unicode_wb_next() returned +** 0, or the first non-zero return value from unicode_wb_next(). +*/ + +extern int unicode_wb_next_cnt(unicode_wb_info_t i, + const unicode_char *chars, + size_t cnt); + +/* +** Finish the wordbreaking algorithm. +** +** A non-zero return code indicates that the callback function was invoked +** and it returned a non-zero return code (which is propagated as a return +** value). +** +** A zero return code indicates that if the callback function was invoked, +** it returned 0, and that the callback function was invoked exactly the same +** number of times that unicode_wb_next() was invoked. +** +** In all case, the wordbreak handle will no longer be valid when this +** function returns. +*/ + +extern int unicode_wb_end(unicode_wb_info_t i); + +/* +** Search for a word boundary. +** +** Obtain a handle by calling unicode_wbscan_init(), then invoke +** unicode_wbscan_next() to provide a unicode stream, then invoke +** unicode_wbscan_end(). unicode_wbscan_end() returns the number of unicode +** characters from the beginning of the stream until the first word boundary. +** +** You may prematurely stop calling unicode_wbscan_next() once it returns a +** non-0 value, which means that there is sufficient context to compute the +** first word boundary, and all further calls to unicode_wbscan_next() will +** be internal no-ops. +*/ + +struct unicode_wbscan_info; + +typedef struct unicode_wbscan_info *unicode_wbscan_info_t; + +unicode_wbscan_info_t unicode_wbscan_init(); + +int unicode_wbscan_next(unicode_wbscan_info_t i, unicode_char ch); + +size_t unicode_wbscan_end(unicode_wbscan_info_t i); + +/* +** A buffer that holds unicode characters, and dynamically grows as needed. +*/ + +struct unicode_buf { + unicode_char *ptr; /* The unicode characters */ + size_t size, /* Buffer size */ + len, /* How many characters in ptr are initialized */ + max; /* Maximum size the buffer can grow to */ +}; + +/* +** Initialize a buffer. Constructor. +*/ + +void unicode_buf_init(/* Initialize this structure. ptr, size, len cleared */ + struct unicode_buf *p, + + /* + ** Maximum size the buffer can grow to. (size_t)-1 + ** means unlimited. + */ + size_t max); +/* +** Like unicode_buf_init, and initialize the new buffer with the contents of +** another buffer. The maximum size of the initialized buffer is exactly the +** number of characters in the existing buffer. This copies a buffer using +** the minimum amount of heap space. +*/ + +#define unicode_buf_init_copy(a,b) \ + do { \ + unicode_buf_init((a), unicode_buf_len(b)); \ + unicode_buf_append_buf((a),(b)); \ + } while (0) + +/* +** Deinitialize the buffer. Destructor. Frees memory. +*/ + +void unicode_buf_deinit(struct unicode_buf *p); + +/* +** Official way to access the characters in the unicode buffer. +*/ +#define unicode_buf_ptr(p) ((p)->ptr) + +/* +** Official way of obtaining the number of characters in the unicode buffer. +*/ +#define unicode_buf_len(p) ((p)->len) + +/* +** Remove all existing characters from an initialized buffer. Sets len to 0. +*/ + +#define unicode_buf_clear(p) ((p)->len=0) + +/* +** Append characters to the existing characters in the unicode buffer. +** The buffer grows, if needed. If the buffer would exceed its maximum size, +** the extra characters get truncated. +** +** Returns 0 if the characters were appended. -1 for a malloc failure. +*/ + +int unicode_buf_append(struct unicode_buf *p, /* The buffer */ + const unicode_char *uc, /* Characters to append */ + size_t l); /* How many of them */ + +/* +** Convert an iso-8859-1 char string and invoke unicode_buf_append(). +*/ + +void unicode_buf_append_char(struct unicode_buf *dst, + const char *str, + size_t cnt); + +/* +** Remove some portion of the unicode buffer +*/ + +void unicode_buf_remove(struct unicode_buf *p, /* The buffer */ + size_t pos, /* Offset in buffer */ + size_t cnt); /* How many to remove */ + +/* +** Append the contents of an existing buffer to another one. +*/ + +#define unicode_buf_append_buf(a,b) \ + unicode_buf_append((a), unicode_buf_ptr(b), unicode_buf_len(b)) + + +/* +** The equivalent of strcmp() for unicode buffers. +*/ + +int unicode_buf_cmp(const struct unicode_buf *a, + const struct unicode_buf *b); + +/* +** The equivalent of unicode_buf_cmp, except that the second buffer is an +** iso-8859-1 string. +*/ + +int unicode_buf_cmp_str(const struct unicode_buf *p, + const char *c, /* iso-8859-1 string */ + size_t cl); /* Number of chars in c */ + +/* +** A wrapper for iconv(3). This wrapper provides a different API for iconv(3). +** A handle gets created by libmail_u_convert_init(). +** libmail_u_convert_init() receives a pointer to the output function +** which receives converted character text. +** +** The output function receives a pointer to the converted character text, and +** the number of characters in the converted text. +** +** The character text to convert gets passed, repeatedly, to +** libmail_u_convert(). Each call to libmail_u_convert() results in +** the output function being invoked, zero or more times, with the converted +** text. Finally, libmail_u_convert_deinit() stops the conversion and +** deallocates the conversion handle. +** +** Internal buffering takes place. libmail_u_convert_deinit() may result +** in the output function being called one or more times, to receive the final +** part of the converted character stream. +** +** The output function should return 0. A non-0 value causes +** libmail_u_convert() and/or libmail_u_convert_deinit() returning +** non-0. +*/ + +struct libmail_u_convert_hdr; + +typedef struct libmail_u_convert_hdr *libmail_u_convert_handle_t; + +/* +** libmail_u_convert_init() returns a non-NULL handle for the requested +** conversion, or NULL if the requested conversion is not available. +*/ + +libmail_u_convert_handle_t +libmail_u_convert_init(/* Convert from this chset */ + const char *src_chset, + + /* Convert to this chset */ + const char *dst_chset, + + /* The output function */ + + int (*output_func)(const char *, size_t, void *), + + /* Passthrough arg */ + void *convert_arg); + +/* +** Repeatedly pass the character text to convert to libmail_u_convert(). +** +** Returns non-0 if the output function returned non-0, or 0 if all invocations +** of the output function returned 0. +*/ + +int libmail_u_convert(/* The conversion handle */ + libmail_u_convert_handle_t handle, + + /* Text to convert */ + const char *text, + + /* Number of bytes to convert */ + size_t cnt); + +/* +** Finish character set conversion. The handle gets deallocated. +** +** May still result in one or more invocations of the output function. +** Returns non-zero if any previous invocation of the output function returned +** non-zero (this includes any invocations of the output function resulting +** from this call, or prior libmail_u_convert() calls), or 0 if all +** invocations of the output function returned 0. +** +** If the errptr is not NULL, *errptr is set to non-zero if there were any +** conversion errors -- if there was any text that could not be converted to +** the destination character text. +*/ + +int libmail_u_convert_deinit(libmail_u_convert_handle_t handle, + int *errptr); + + +/* +** Specialization: save converted character text in a buffer. +** +** Implementation: call libmail_u_convert_tocbuf_init() instead of +** libmail_u_convert_init(), then call libmail_u_convert() and +** libmail_u_convert_deinit(), as usual. +** +** If libmail_u_convert_deinit() returns 0, *cbufptr_ret gets initialized to a +** malloc()ed buffer, and the number of converted characters, the size of the +** malloc()ed buffer, are placed into *csize_ret arguments, that were passed +** to libmail_u_convert_tou_init(). +** +** Note: if the converted string is an empty string, *cbufsize_ret is set to 0, +** but *cbufptr_ptr still gets initialized (to a dummy malloced buffer). +** +** The optional nullterminate places a trailing \0 character after the +** converted string (this is included in *cbufsize_ret). +*/ + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_init(/* Convert from this chset */ + const char *src_chset, + + /* Convert to this chset */ + const char *dst_chset, + + /* malloced buffer */ + char **cbufptr_ret, + + /* size of the malloced buffer */ + size_t *cbufsize_ret, + + /* null terminate the resulting string */ + int nullterminate + ); + + +/* +** Specialization: convert some character text to a unicode_char array. +** +** This is like libmail_u_convert_tocbuf_init(), but converts to a unicode_char +** array. +** +** The returned *ucsize_ret is initialized with the number of unicode_chars, +** rather than the byte count. +** +** In all other ways, this function behaves identically to +** libmail_u_convert_tocbuf_init(). +*/ + +libmail_u_convert_handle_t +libmail_u_convert_tou_init(/* Convert from this chset */ + const char *src_chset, + + /* malloc()ed buffer pointer, on exit. */ + unicode_char **ucptr_ret, + + /* size of the malloc()ed buffer, upon exit */ + size_t *ucsize_ret, + + /* If true, terminate with U+0x0000, for convenience */ + int nullterminate + ); + +/* +** Specialization: convert a unicode_char array to some character text. +** +** This is the opposite of libmail_u_convert_tou_init(). Call this to +** initialize the conversion handle, then use libmail_u_convert_uc() +** instead of libmail_u_convert. +*/ + +libmail_u_convert_handle_t +libmail_u_convert_fromu_init(/* Convert to this chset */ + const char *dst_chset, + + /* malloc()ed buffer pointer, on exit. */ + char **cbufptr_ret, + + /* size of the malloc()ed buffer, upon exit */ + size_t *cbufsize_ret, + + /* If true, terminate with U+0x0000, for convenience */ + int nullterminate + ); + +int libmail_u_convert_uc(/* The conversion handle */ + libmail_u_convert_handle_t handle, + + /* Text to convert */ + const unicode_char *text, + + /* Number of bytes to convert */ + size_t cnt); + +/* +** Initialize conversion to UTF-8. +** +** This is a wrapper for libmail_u_convert_tocbuf_init() that specifies the +** destination charset as UTF-8. +*/ + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_toutf8_init(const char *src_chset, + char **cbufptr_ret, + size_t *cbufsize_ret, + int nullterminate); + +/* +** Initialize conversion from UTF-8. +** +** This is a wrapper for libmail_u_convert_tocbuf_init() that specifies the +** source charset as UTF-8. +*/ + +libmail_u_convert_handle_t +libmail_u_convert_tocbuf_fromutf8_init(const char *dst_chset, + char **cbufptr_ret, + size_t *cbufsize_ret, + int nullterminate); + +/* +** Convert a character string to UTF-8. +** +** Returns a malloc-ed buffer holding the UTF-8 string, or NULL if an +** error occured. +*/ +char *libmail_u_convert_toutf8(/* Text to convert to UTF-8 */ + const char *text, + + /* Character set to convert to UTF-8 */ + const char *charset, + + /* + ** If non-NULL, and a non-NULL pointer is + ** returned, *error is set to non-zero if + ** a character conversion error has occured. + */ + int *error); + +/* +** Convert UTF-8 text to another character set. +** +** Returns a malloc-ed buffer holding the string converted to the specified +** character set, or NULL if an error occured. +*/ + +char *libmail_u_convert_fromutf8(/* A UTF-8 string */ + const char *text, + + /* + ** Convert the UTF-8 string to this character + ** set. + */ + + const char *charset, + + /* + ** If non-NULL, and a non-NULL pointer is + ** returned, *error is set to non-zero if + ** a character conversion error has occured. + */ + int *error); + +/* +** Convert one charset to another charset, placing the result in a malloc-ed +** buffer. +** +** Returns a malloc-ed buffer holding the string converted to the specified +** character set, or NULL if an error occured. +*/ + +char *libmail_u_convert_tobuf(/* A string to convert */ + const char *text, + + /* + ** String's charset. + */ + + const char *charset, + + /* + ** Destination charset + */ + const char *dstcharset, + + /* + ** If non-NULL, and a non-NULL pointer is + ** returned, *error is set to non-zero if + ** a character conversion error has occured. + */ + int *error); + +/* +** Convenience function: call libmail_u_convert_tou_init(), feed the +** character string through libmail_u_convert(), then call +** libmail_u_convert_deinit(). +** +** If this function returns 0, *uc and *ucsize is set to a malloced buffer+size +** holding the unicode char array. +*/ + +int libmail_u_convert_tou_tobuf(/* Character text to convert */ + const char *text, + + /* Number of characters */ + size_t text_l, + + /* text's charset */ + const char *charset, + + /* + ** If this function returns 0, this gets + ** initialized + */ + unicode_char **uc, + + /* + ** Size of the allocated buffer + */ + size_t *ucsize, + + /* + ** If not null and this function returns 0, + ** this is set to non-0 if there + ** was a conversion error (but the output + ** buffer gets still allocated and + ** initialized) + */ + int *err); + +/* +** Convenience function: call libmail_u_convert_fromu_init(), feed the +** unicode_array through libmail_u_convert_uc(), then call +** libmail_u_convert_deinit(). +** +** If this function returns 0, *uc and *ucsize is set to a malloced buffer+size +** holding the converted character string +*/ + +int libmail_u_convert_fromu_tobuf(/* Unicode array to convert to a char str */ + const unicode_char *utext, + + /* + ** Size of the unicode array. + ** If this is (size_t)-1, utext is a + ** 0-terminated array. + */ + size_t utext_l, + + /* + ** Convert the unicode array to this charset. + */ + const char *charset, + + /* + ** If libmail_u_convert_fromu_tobuf() + ** returns 0, this is initialized to a + ** malloced buffer with a 0-terminated + ** string is kept. + */ + char **c, + + /* + ** Size of the initialized array, including + ** the 0-terminator. + */ + size_t *csize, + + /* + ** If libmail_u_convert_fromu_tobuf() + ** returns 0 and this is not NULL, + ** *err is set to non-0 if there was a + ** conversion error to the requested + ** character set. + */ + int *err); + +/* +** Convenience function: convert a string in a given character set +** to/from uppercase, lowercase, or something else. +** +** This is done by calling libmail_u_convert_tou_tobuf() first, +** applying the title_func and char_func, then using +** libmail_u_convert_fromu_tobuf(). +** +** A NULL return indicates that the requested conversion cannot be performed. +*/ + +char *libmail_u_convert_tocase( /* String to convert */ + const char *str, + + /* String's character set */ + + const char *charset, + + /* + ** Conversion of the first character in + ** str: unicode_uc, unicode_lc, or unicode_tc: + */ + + unicode_char (*first_char_func)(unicode_char), + + /* + ** Conversion of the second and the remaining + ** character in str. If NULL, same as + ** first_char_func. + */ + unicode_char (*char_func)(unicode_char)); + + + +/* Either UCS-4BE or UCS-4LE, matching the native unicode_char endianness */ + +extern const char libmail_u_ucs4_native[]; + +/* Either UCS-2BE or UCS-2LE, matching the native unicode_char endianness */ + +extern const char libmail_u_ucs2_native[]; + +/* +** Modified-UTF7 encoding used for IMAP folder names. Pass it for a charset +** parameter. +** +** This can be followed by a " " and up to 15 characters to be escaped in +** addition to unicode chars. +*/ + +#define unicode_x_imap_modutf7 "x-imap-modutf7" + +#if 0 +{ +#endif + +#ifdef __cplusplus +} + +extern size_t unicode_wcwidth(const std::vector<unicode_char> &uc); + +namespace mail { + + /* + ** Interface to iconv. + ** + ** Subclass converted(). Invoke begin(), then operator(), repeatedly, + ** then end(). + ** + ** converted() receives the converted text. + */ + + class iconvert { + + libmail_u_convert_handle_t handle; + + public: + iconvert(); + virtual ~iconvert(); + + /* Start conversion. + ** Returns false if the requested conversion cannot be done. + **/ + + bool begin(/* Convert from */ + const std::string &src_chset, + + /* Convert to */ + const std::string &dst_chset); + + /* Feed iconv(3). Returns false if the conversion was aborted. + */ + + bool operator()(const char *, size_t); + + bool operator()(const unicode_char *, size_t); + + /* + ** Get the results here. If the subclass returns a non-0 + ** value, the conversion is aborted. + */ + + virtual int converted(const char *, size_t); + + /* + ** End of conversion. + ** + ** Returns true if all calls to converted() returned 0, + ** false if the conversion was aborted. + ** + ** errflag is set to true if there was a character that could + ** not be converted, and passed to converted(). + */ + + bool end(bool &errflag) + { + return end(&errflag); + } + + bool end() + { + return end(NULL); + } + + /* Convert between two different charsets */ + + static std::string convert(const std::string &text, + const std::string &charset, + const std::string &dstcharset, + bool &errflag); + + /* Convert between two different charsets */ + + static std::string convert(const std::string &text, + const std::string &charset, + const std::string &dstcharset) + { + bool dummy; + + return convert(text, charset, dstcharset, dummy); + } + + /* Convert from unicode to a charset */ + + static std::string convert(const std::vector<unicode_char> &uc, + const std::string &dstcharset, + bool &errflag); + + /* Convert from unicode to a charset */ + + static std::string convert(const std::vector<unicode_char> &uc, + const std::string &dstcharset) + { + bool dummy; + + return convert(uc, dstcharset, dummy); + } + + /* Convert charset to unicode */ + + static bool convert(const std::string &text, + const std::string &charset, + std::vector<unicode_char> &uc); + + + /* Convert to upper/lower/title case */ + + static std::string + convert_tocase(/* Text string */ + const std::string &text, + + /* Its charset */ + const std::string &charset, + + /* First character: unicode_uc, unicode_lc, or unicode_tc */ + unicode_char (*first_char_func)(unicode_char), + + /* If not NULL, second and subsequent chars */ + unicode_char (*char_func)(unicode_char) + =NULL) + { + bool dummy; + + return convert_tocase(text, charset, dummy, + first_char_func, + char_func); + } + + /* Convert to upper/lower/title case */ + + static std::string + convert_tocase(/* Text string */ + const std::string &text, + + /* Its charset */ + const std::string &charset, + + /* Set if there's a conversion error */ + bool &err, + + /* First character: unicode_uc, unicode_lc, or unicode_tc */ + unicode_char (*first_char_func)(unicode_char), + + /* If not NULL, second and subsequent chars */ + unicode_char (*char_func)(unicode_char) + =NULL); + private: + bool end(bool *); + + public: + class tou; + class fromu; + }; + + /* Convert output of iconvert to unicode_chars. */ + + class iconvert::tou : public iconvert { + + public: + bool begin(const std::string &chset); + + virtual int converted(const unicode_char *, size_t); + + using iconvert::operator(); + private: + int converted(const char *ptr, size_t cnt); + + public: + template<typename iter_t> class to_iter_class; + + template<typename input_iter_t, + typename output_iter_t> + static output_iter_t convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + output_iter_t out_iter); + + template<typename input_iter_t> + static void convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + std::vector<unicode_char> &out_buf) + { + out_buf.clear(); + std::back_insert_iterator<std::vector<unicode_char> > + insert_iter(out_buf); + + convert(from_iter, to_iter, chset, insert_iter); + } + + static void convert(const std::string &str, + const std::string &chset, + std::vector<unicode_char> &out_buf); + }; + + /* Helper class that saves unicode output into an output iterator */ + + template<typename iter_t> + class iconvert::tou::to_iter_class : public iconvert::tou { + + iter_t iter; + public: + + to_iter_class(iter_t iterValue) + : iter(iterValue) {} + + using tou::operator(); + + operator iter_t() const { return iter; } + + private: + int converted(const unicode_char *ptr, size_t cnt) + { + while (cnt) + { + *iter=*ptr; + + ++iter; + ++ptr; + --cnt; + } + return 0; + } + }; + + template<typename input_iter_t, + typename output_iter_t> + output_iter_t iconvert::tou::convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + output_iter_t out_iter) + { + class to_iter_class<output_iter_t> out(out_iter); + + if (!out.begin(chset)) + return out; + + std::vector<char> string; + + while (from_iter != to_iter) + { + string.push_back(*from_iter++); + + if (string.size() > 31) + { + out(&string[0], string.size()); + string.clear(); + } + } + + if (string.size() > 0) + out(&string[0], string.size()); + + out.end(); + return out; + } + + /* Convert output of iconvert from unicode_chars. */ + + class iconvert::fromu : public iconvert { + + public: + bool begin(const std::string &chset); + + using iconvert::operator(); + + template<typename iter_t> class to_iter_class; + + template<typename input_iter_t, + typename output_iter_t> + static output_iter_t convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + output_iter_t out_iter); + + template<typename input_iter_t> + static void convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + std::string &out_buf) + { + out_buf=""; + std::back_insert_iterator<std::string> + insert_iter(out_buf); + + convert(from_iter, to_iter, chset, insert_iter); + } + + static void convert(const std::vector<unicode_char> &ubuf, + const std::string &chset, + std::string &out_buf); + + static std::string convert(const std::vector<unicode_char> + &ubuf, + const std::string &chset); + }; + + /* Helper class that saves unicode output into an output iterator */ + + template<typename iter_t> + class iconvert::fromu::to_iter_class : public iconvert::fromu { + + iter_t iter; + public: + + to_iter_class(iter_t iterValue) + : iter(iterValue) {} + + using fromu::operator(); + + operator iter_t() const { return iter; } + + private: + int converted(const char *ptr, size_t cnt) + { + while (cnt) + { + *iter=*ptr; + + ++iter; + ++ptr; + --cnt; + } + return 0; + } + }; + + template<typename input_iter_t, + typename output_iter_t> + output_iter_t iconvert::fromu::convert(input_iter_t from_iter, + input_iter_t to_iter, + const std::string &chset, + output_iter_t out_iter) + { + class to_iter_class<output_iter_t> out(out_iter); + + if (!out.begin(chset)) + return out; + + std::vector<unicode_char> string; + + while (from_iter != to_iter) + { + string.push_back(*from_iter++); + + if (string.size() > 31) + { + out(&string[0], string.size()); + string.clear(); + } + } + + if (string.size() > 0) + out(&string[0], string.size()); + + out.end(); + return out; + } + + /* + ** Unicode linebreaking algorithm, tr14. + */ + + extern "C" int linebreak_trampoline(int value, void *ptr); + extern "C" int linebreakc_trampoline(int value, unicode_char ch, + void *ptr); + + /* + ** Subclass linebreak_callback_base, implement operator()(int). + ** + ** Use operator<< or operator()(iterator, iterator) to feed + ** unicode_chars into the linebreaking algorithm. The subclass receives + ** UNICODE_LB values, as they become available. + */ + + class linebreak_callback_base { + + unicode_lb_info_t handle; + + int opts; + + linebreak_callback_base(const linebreak_callback_base &); + /* NOT IMPLEMENTED */ + + linebreak_callback_base &operator==(const + linebreak_callback_base &); + /* NOT IMPLEMENTED */ + + public: + linebreak_callback_base(); + virtual ~linebreak_callback_base(); + + void finish(); + + void set_opts(int opts); + + friend int linebreak_trampoline(int, void *); + + linebreak_callback_base &operator<<(unicode_char uc); + + template<typename iter_type> + linebreak_callback_base &operator()(iter_type beg_iter, + iter_type end_iter) + { + while (beg_iter != end_iter) + operator<<(*beg_iter++); + return *this; + } + + linebreak_callback_base &operator<<(const + std::vector<unicode_char> + &vec) + { + return operator()(vec.begin(), vec.end()); + } + private: + virtual int operator()(int); + }; + + class linebreak_callback_save_buf : public linebreak_callback_base { + + public: + std::list<int> lb_buf; + + linebreak_callback_save_buf(); + ~linebreak_callback_save_buf(); + + private: + int operator()(int value); + }; + + /* + ** Convert an input iterator sequence over unicode_chars into + ** an input iterator sequence over linebreak values. + */ + + template<typename input_t> class linebreak_iter + : public std::iterator<std::input_iterator_tag, int, void> + { + mutable input_t iter_value, end_iter_value; + + mutable linebreak_callback_save_buf *buf; + + void fill() const + { + if (buf == NULL) + return; + + while (buf->lb_buf.empty()) + { + if (iter_value == end_iter_value) + { + buf->finish(); + if (buf->lb_buf.empty()) + { + delete buf; + buf=NULL; + } + break; + } + + buf->operator<<(*iter_value++); + } + } + + mutable value_type bufvalue; + + public: + linebreak_iter(const input_t &iter_valueArg, + const input_t &iter_endvalueArg) + : iter_value(iter_valueArg), + end_iter_value(iter_endvalueArg), + buf(new linebreak_callback_save_buf) + { + } + + linebreak_iter() : buf(NULL) + { + } + + void set_opts(int opts) + { + if (buf) + buf->set_opts(opts); + } + + ~linebreak_iter() + { + if (buf) + delete buf; + } + + linebreak_iter(const linebreak_iter<input_t> &v) + : buf(NULL) + { + operator=(v); + } + + linebreak_iter<input_t> &operator=(const + linebreak_iter<input_t> &v) + { + if (buf) + delete buf; + buf=v.buf; + iter_value=v.iter_value; + end_iter_value=v.end_iter_value; + v.buf=NULL; + return *this; + } + + bool operator==(const linebreak_iter<input_t> &v) const + { + fill(); + v.fill(); + + return buf == NULL && v.buf == NULL; + } + + bool operator!=(const linebreak_iter<input_t> &v) const + { + return !operator==(v); + } + + value_type operator*() const + { + fill(); + return buf == NULL ? UNICODE_LB_MANDATORY: + buf->lb_buf.front(); + } + + linebreak_iter<input_t> &operator++() + { + bufvalue=operator*(); + + if (buf) + buf->lb_buf.pop_front(); + return *this; + } + + const value_type *operator++(int) + { + operator++(); + return &bufvalue; + } + }; + + /* + ** Like linebreak_callback_base, except the subclass receives both + ** the linebreaking value, and the unicode character. + */ + + class linebreakc_callback_base { + + unicode_lbc_info_t handle; + + int opts; + + linebreakc_callback_base(const linebreakc_callback_base &); + /* NOT IMPLEMENTED */ + + linebreakc_callback_base &operator==(const + linebreakc_callback_base + &); + /* NOT IMPLEMENTED */ + + + public: + linebreakc_callback_base(); + virtual ~linebreakc_callback_base(); + + void finish(); + + void set_opts(int opts); + + friend int linebreakc_trampoline(int, unicode_char, void *); + + linebreakc_callback_base &operator<<(unicode_char uc); + + template<typename iter_type> + linebreakc_callback_base &operator()(iter_type beg_iter, + iter_type end_iter) + { + while (beg_iter != end_iter) + operator<<(*beg_iter++); + return *this; + } + + linebreakc_callback_base &operator<<(const + std::vector<unicode_char> + &vec) + { + return operator()(vec.begin(), vec.end()); + } + private: + virtual int operator()(int, unicode_char); + }; + + class linebreakc_callback_save_buf : public linebreakc_callback_base { + + public: + std::list<std::pair<int, unicode_char> > lb_buf; + + linebreakc_callback_save_buf(); + ~linebreakc_callback_save_buf(); + + private: + int operator()(int, unicode_char); + }; + + + /* + ** Convert an input iterator sequence over unicode_chars into + ** an input iterator sequence over std::pair<int, unicode_char>, + ** the original unicode character, and the linebreaking value before + ** the character. + */ + + template<typename input_t> class linebreakc_iter + : public std::iterator<std::input_iterator_tag, + std::pair<int, unicode_char>, void> + { + mutable input_t iter_value, end_iter_value; + + mutable linebreakc_callback_save_buf *buf; + + void fill() const + { + if (buf == NULL) + return; + + while (buf->lb_buf.empty()) + { + if (iter_value == end_iter_value) + { + buf->finish(); + if (buf->lb_buf.empty()) + { + delete buf; + buf=NULL; + } + break; + } + + buf->operator<<(*iter_value); + ++iter_value; + } + } + + mutable value_type bufvalue; + + public: + linebreakc_iter(const input_t &iter_valueArg, + const input_t &iter_endvalueArg) + : iter_value(iter_valueArg), + end_iter_value(iter_endvalueArg), + buf(new linebreakc_callback_save_buf) + { + } + + linebreakc_iter() : buf(NULL) + { + } + + ~linebreakc_iter() + { + if (buf) + delete buf; + } + + linebreakc_iter(const linebreakc_iter<input_t> &v) + : buf(NULL) + { + operator=(v); + } + + linebreakc_iter<input_t> &operator=(const + linebreakc_iter<input_t> &v) + { + if (buf) + delete buf; + buf=v.buf; + iter_value=v.iter_value; + end_iter_value=v.end_iter_value; + v.buf=NULL; + return *this; + } + + bool operator==(const linebreakc_iter<input_t> &v) const + { + fill(); + v.fill(); + + return buf == NULL && v.buf == NULL; + } + + bool operator!=(const linebreakc_iter<input_t> &v) const + { + return !operator==(v); + } + + value_type operator*() const + { + fill(); + return buf == NULL ? + std::make_pair(UNICODE_LB_MANDATORY, + (unicode_char)0): + buf->lb_buf.front(); + } + + linebreakc_iter<input_t> &operator++() + { + bufvalue=operator*(); + + if (buf) + buf->lb_buf.pop_front(); + return *this; + } + + const value_type *operator++(int) + { + operator++(); + return &bufvalue; + } + }; + + + /* + ** Subclass wordbreak_callback_base, implement operator()(int). + ** + ** Use operator<< or operator()(iterator, iterator) to feed + ** unicode_chars into the wordbreaking algorithm. The subclass receives + ** word flags, as they become available. + */ + + extern "C" int wordbreak_trampoline(int value, void *ptr); + + class wordbreak_callback_base { + + unicode_wb_info_t handle; + + wordbreak_callback_base(const wordbreak_callback_base &); + /* NOT IMPLEMENTED */ + + wordbreak_callback_base &operator==(const + wordbreak_callback_base &); + /* NOT IMPLEMENTED */ + + public: + wordbreak_callback_base(); + virtual ~wordbreak_callback_base(); + + void finish(); + + friend int wordbreak_trampoline(int, void *); + + wordbreak_callback_base &operator<<(unicode_char uc); + + template<typename iter_type> + wordbreak_callback_base &operator()(iter_type beg_iter, + iter_type end_iter) + { + while (beg_iter != end_iter) + operator<<(*beg_iter++); + return *this; + } + + wordbreak_callback_base &operator<<(const + std::vector<unicode_char> + &vec) + { + return operator()(vec.begin(), vec.end()); + } + private: + virtual int operator()(bool); + }; + + /* + ** A C++ wrapper for unicode_wbscan. + */ + + class wordbreakscan { + + unicode_wbscan_info_t handle; + + wordbreakscan(const wordbreakscan &); + /* NOT IMPLEMENTED */ + + wordbreakscan &operator==(const wordbreakscan &); + /* NOT IMPLEMENTED */ + public: + + wordbreakscan(); + ~wordbreakscan(); + + bool operator<<(unicode_char uc); + + size_t finish(); + }; + +} +#endif + +#endif diff --git a/unicode/unicode_graphemebreak.c b/unicode/unicode_graphemebreak.c new file mode 100644 index 0000000..5939dc8 --- /dev/null +++ b/unicode/unicode_graphemebreak.c @@ -0,0 +1,95 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include <unistd.h> +#include <stdint.h> +#include <stdlib.h> + +#define UNICODE_GRAPHEMEBREAK_ANY 0x00 +#define UNICODE_GRAPHEMEBREAK_CR 0x01 +#define UNICODE_GRAPHEMEBREAK_LF 0x02 +#define UNICODE_GRAPHEMEBREAK_Control 0x03 +#define UNICODE_GRAPHEMEBREAK_Extend 0x04 +#define UNICODE_GRAPHEMEBREAK_Prepend 0x05 +#define UNICODE_GRAPHEMEBREAK_SpacingMark 0x06 +#define UNICODE_GRAPHEMEBREAK_L 0x07 +#define UNICODE_GRAPHEMEBREAK_V 0x08 +#define UNICODE_GRAPHEMEBREAK_T 0x09 +#define UNICODE_GRAPHEMEBREAK_LV 0x0A +#define UNICODE_GRAPHEMEBREAK_LVT 0x0B + +#include "graphemebreaktab.h" + +int unicode_grapheme_break(unicode_char a, unicode_char b) +{ + uint8_t ac=unicode_tab_lookup(a, unicode_indextab, + sizeof(unicode_indextab)/sizeof(unicode_indextab[0]), + unicode_rangetab, + unicode_classtab, + UNICODE_GRAPHEMEBREAK_ANY), + bc=unicode_tab_lookup(b, unicode_indextab, + sizeof(unicode_indextab)/sizeof(unicode_indextab[0]), + unicode_rangetab, + unicode_classtab, + UNICODE_GRAPHEMEBREAK_ANY); + + /* GB1 and GB2 are implied */ + + if (ac == UNICODE_GRAPHEMEBREAK_CR && bc == UNICODE_GRAPHEMEBREAK_LF) + return 0; /* GB3 */ + + + switch (ac) { + case UNICODE_GRAPHEMEBREAK_CR: + case UNICODE_GRAPHEMEBREAK_LF: + case UNICODE_GRAPHEMEBREAK_Control: + return 1; /* GB4 */ + default: + break; + } + + switch (bc) { + case UNICODE_GRAPHEMEBREAK_CR: + case UNICODE_GRAPHEMEBREAK_LF: + case UNICODE_GRAPHEMEBREAK_Control: + return 1; /* GB5 */ + default: + break; + } + + if (ac == UNICODE_GRAPHEMEBREAK_L) + switch (bc) { + case UNICODE_GRAPHEMEBREAK_L: + case UNICODE_GRAPHEMEBREAK_V: + case UNICODE_GRAPHEMEBREAK_LV: + case UNICODE_GRAPHEMEBREAK_LVT: + return 0; /* GB6 */ + } + + if ((ac == UNICODE_GRAPHEMEBREAK_LV || + ac == UNICODE_GRAPHEMEBREAK_V) && + (bc == UNICODE_GRAPHEMEBREAK_V || + bc == UNICODE_GRAPHEMEBREAK_T)) + return 0; /* GB7 */ + + if ((ac == UNICODE_GRAPHEMEBREAK_LVT || + ac == UNICODE_GRAPHEMEBREAK_T) && + bc == UNICODE_GRAPHEMEBREAK_T) + return 0; /* GB8 */ + + if (bc == UNICODE_GRAPHEMEBREAK_Extend) + return 0; /* GB9 */ + + if (bc == UNICODE_GRAPHEMEBREAK_SpacingMark) + return 0; /* GB9a */ + + if (ac == UNICODE_GRAPHEMEBREAK_Prepend) + return 0; /* GB9b */ + + return 1; /* GB10 */ +} diff --git a/unicode/unicode_htmlent.c b/unicode/unicode_htmlent.c new file mode 100644 index 0000000..549d069 --- /dev/null +++ b/unicode/unicode_htmlent.c @@ -0,0 +1,55 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +#include <stdlib.h> + +struct i { + size_t n_start; + size_t n_size; + unicode_char v; +}; + +#include "unicode_htmlent.h" + + +static int compar(const void *key, const void *obj) +{ + size_t j; + const char *p=n + ((const struct i *)obj)->n_start; + const char *ckey=(const char *)key; + + for (j=0; j<((const struct i *)obj)->n_size; ++j) + { + if (*ckey < *p) + return -1; + + if (*ckey > *p) + return 1; + + ++p; + ++ckey; + } + + if (*ckey) + return 1; + + return 0; +} + +unicode_char unicode_html40ent_lookup(const char *n) +{ + const struct i *ptr= + (const struct i *)bsearch(n, ii, + sizeof(ii)/sizeof(ii[0]), + sizeof(ii[0]), compar); + + if (ptr) + return ptr->v; + return 0; +} diff --git a/unicode/unicode_htmlent.h b/unicode/unicode_htmlent.h new file mode 100644 index 0000000..a903436 --- /dev/null +++ b/unicode/unicode_htmlent.h @@ -0,0 +1,511 @@ +static const char n[]={ + 65, 69, 108, 105, 103, /* AElig */ + 65, 97, 99, 117, 116, 101, /* Aacute */ + 65, 99, 105, 114, 99, /* Acirc */ + 65, 103, 114, 97, 118, 101, /* Agrave */ + 65, 108, 112, 104, 97, /* Alpha */ + 65, 114, 105, 110, 103, /* Aring */ + 65, 116, 105, 108, 100, 101, /* Atilde */ + 65, 117, 109, 108, /* Auml */ + 66, 101, 116, 97, /* Beta */ + 67, 99, 101, 100, 105, 108, /* Ccedil */ + 67, 104, 105, /* Chi */ + 68, 97, 103, 103, 101, 114, /* Dagger */ + 68, 101, 108, 116, 97, /* Delta */ + 69, 84, 72, /* ETH */ + 69, 97, 99, 117, 116, 101, /* Eacute */ + 69, 99, 105, 114, 99, /* Ecirc */ + 69, 103, 114, 97, 118, 101, /* Egrave */ + 69, 112, 115, 105, 108, 111, 110, /* Epsilon */ + 69, 116, 97, /* Eta */ + 69, 117, 109, 108, /* Euml */ + 71, 97, 109, 109, 97, /* Gamma */ + 73, 97, 99, 117, 116, 101, /* Iacute */ + 73, 99, 105, 114, 99, /* Icirc */ + 73, 103, 114, 97, 118, 101, /* Igrave */ + 73, 111, 116, 97, /* Iota */ + 73, 117, 109, 108, /* Iuml */ + 75, 97, 112, 112, 97, /* Kappa */ + 76, 97, 109, 98, 100, 97, /* Lambda */ + 77, 117, /* Mu */ + 78, 116, 105, 108, 100, 101, /* Ntilde */ + 78, 117, /* Nu */ + 79, 69, 108, 105, 103, /* OElig */ + 79, 97, 99, 117, 116, 101, /* Oacute */ + 79, 99, 105, 114, 99, /* Ocirc */ + 79, 103, 114, 97, 118, 101, /* Ograve */ + 79, 109, 101, 103, 97, /* Omega */ + 79, 109, 105, 99, 114, 111, 110, /* Omicron */ + 79, 115, 108, 97, 115, 104, /* Oslash */ + 79, 116, 105, 108, 100, 101, /* Otilde */ + 79, 117, 109, 108, /* Ouml */ + 80, 104, 105, /* Phi */ + 80, 105, /* Pi */ + 80, 114, 105, 109, 101, /* Prime */ + 80, 115, 105, /* Psi */ + 82, 104, 111, /* Rho */ + 83, 99, 97, 114, 111, 110, /* Scaron */ + 83, 105, 103, 109, 97, /* Sigma */ + 84, 72, 79, 82, 78, /* THORN */ + 84, 97, 117, /* Tau */ + 84, 104, 101, 116, 97, /* Theta */ + 85, 97, 99, 117, 116, 101, /* Uacute */ + 85, 99, 105, 114, 99, /* Ucirc */ + 85, 103, 114, 97, 118, 101, /* Ugrave */ + 85, 112, 115, 105, 108, 111, 110, /* Upsilon */ + 85, 117, 109, 108, /* Uuml */ + 88, 105, /* Xi */ + 89, 97, 99, 117, 116, 101, /* Yacute */ + 89, 117, 109, 108, /* Yuml */ + 90, 101, 116, 97, /* Zeta */ + 97, 97, 99, 117, 116, 101, /* aacute */ + 97, 99, 105, 114, 99, /* acirc */ + 97, 99, 117, 116, 101, /* acute */ + 97, 101, 108, 105, 103, /* aelig */ + 97, 103, 114, 97, 118, 101, /* agrave */ + 97, 108, 101, 102, 115, 121, 109, /* alefsym */ + 97, 108, 112, 104, 97, /* alpha */ + 97, 109, 112, /* amp */ + 97, 110, 100, /* and */ + 97, 110, 103, /* ang */ + 97, 112, 111, 115, /* apos */ + 97, 114, 105, 110, 103, /* aring */ + 97, 115, 121, 109, 112, /* asymp */ + 97, 116, 105, 108, 100, 101, /* atilde */ + 97, 117, 109, 108, /* auml */ + 98, 100, 113, 117, 111, /* bdquo */ + 98, 101, 116, 97, /* beta */ + 98, 114, 118, 98, 97, 114, /* brvbar */ + 98, 117, 108, 108, /* bull */ + 99, 97, 112, /* cap */ + 99, 99, 101, 100, 105, 108, /* ccedil */ + 99, 101, 100, 105, 108, /* cedil */ + 99, 101, 110, 116, /* cent */ + 99, 104, 105, /* chi */ + 99, 105, 114, 99, /* circ */ + 99, 108, 117, 98, 115, /* clubs */ + 99, 111, 110, 103, /* cong */ + 99, 111, 112, 121, /* copy */ + 99, 114, 97, 114, 114, /* crarr */ + 99, 117, 112, /* cup */ + 99, 117, 114, 114, 101, 110, /* curren */ + 100, 65, 114, 114, /* dArr */ + 100, 97, 103, 103, 101, 114, /* dagger */ + 100, 97, 114, 114, /* darr */ + 100, 101, 103, /* deg */ + 100, 101, 108, 116, 97, /* delta */ + 100, 105, 97, 109, 115, /* diams */ + 100, 105, 118, 105, 100, 101, /* divide */ + 101, 97, 99, 117, 116, 101, /* eacute */ + 101, 99, 105, 114, 99, /* ecirc */ + 101, 103, 114, 97, 118, 101, /* egrave */ + 101, 109, 112, 116, 121, /* empty */ + 101, 109, 115, 112, /* emsp */ + 101, 110, 115, 112, /* ensp */ + 101, 112, 115, 105, 108, 111, 110, /* epsilon */ + 101, 113, 117, 105, 118, /* equiv */ + 101, 116, 97, /* eta */ + 101, 116, 104, /* eth */ + 101, 117, 109, 108, /* euml */ + 101, 117, 114, 111, /* euro */ + 101, 120, 105, 115, 116, /* exist */ + 102, 110, 111, 102, /* fnof */ + 102, 111, 114, 97, 108, 108, /* forall */ + 102, 114, 97, 99, 49, 50, /* frac12 */ + 102, 114, 97, 99, 49, 52, /* frac14 */ + 102, 114, 97, 99, 51, 52, /* frac34 */ + 102, 114, 97, 115, 108, /* frasl */ + 103, 97, 109, 109, 97, /* gamma */ + 103, 101, /* ge */ + 103, 116, /* gt */ + 104, 65, 114, 114, /* hArr */ + 104, 97, 114, 114, /* harr */ + 104, 101, 97, 114, 116, 115, /* hearts */ + 104, 101, 108, 108, 105, 112, /* hellip */ + 105, 97, 99, 117, 116, 101, /* iacute */ + 105, 99, 105, 114, 99, /* icirc */ + 105, 101, 120, 99, 108, /* iexcl */ + 105, 103, 114, 97, 118, 101, /* igrave */ + 105, 109, 97, 103, 101, /* image */ + 105, 110, 102, 105, 110, /* infin */ + 105, 110, 116, /* int */ + 105, 111, 116, 97, /* iota */ + 105, 113, 117, 101, 115, 116, /* iquest */ + 105, 115, 105, 110, /* isin */ + 105, 117, 109, 108, /* iuml */ + 107, 97, 112, 112, 97, /* kappa */ + 108, 65, 114, 114, /* lArr */ + 108, 97, 109, 98, 100, 97, /* lambda */ + 108, 97, 110, 103, /* lang */ + 108, 97, 113, 117, 111, /* laquo */ + 108, 97, 114, 114, /* larr */ + 108, 99, 101, 105, 108, /* lceil */ + 108, 100, 113, 117, 111, /* ldquo */ + 108, 101, /* le */ + 108, 102, 108, 111, 111, 114, /* lfloor */ + 108, 111, 119, 97, 115, 116, /* lowast */ + 108, 111, 122, /* loz */ + 108, 114, 109, /* lrm */ + 108, 115, 97, 113, 117, 111, /* lsaquo */ + 108, 115, 113, 117, 111, /* lsquo */ + 108, 116, /* lt */ + 109, 97, 99, 114, /* macr */ + 109, 100, 97, 115, 104, /* mdash */ + 109, 105, 99, 114, 111, /* micro */ + 109, 105, 100, 100, 111, 116, /* middot */ + 109, 105, 110, 117, 115, /* minus */ + 109, 117, /* mu */ + 110, 97, 98, 108, 97, /* nabla */ + 110, 98, 115, 112, /* nbsp */ + 110, 100, 97, 115, 104, /* ndash */ + 110, 101, /* ne */ + 110, 105, /* ni */ + 110, 111, 116, /* not */ + 110, 111, 116, 105, 110, /* notin */ + 110, 115, 117, 98, /* nsub */ + 110, 116, 105, 108, 100, 101, /* ntilde */ + 110, 117, /* nu */ + 111, 97, 99, 117, 116, 101, /* oacute */ + 111, 99, 105, 114, 99, /* ocirc */ + 111, 101, 108, 105, 103, /* oelig */ + 111, 103, 114, 97, 118, 101, /* ograve */ + 111, 108, 105, 110, 101, /* oline */ + 111, 109, 101, 103, 97, /* omega */ + 111, 109, 105, 99, 114, 111, 110, /* omicron */ + 111, 112, 108, 117, 115, /* oplus */ + 111, 114, /* or */ + 111, 114, 100, 102, /* ordf */ + 111, 114, 100, 109, /* ordm */ + 111, 115, 108, 97, 115, 104, /* oslash */ + 111, 116, 105, 108, 100, 101, /* otilde */ + 111, 116, 105, 109, 101, 115, /* otimes */ + 111, 117, 109, 108, /* ouml */ + 112, 97, 114, 97, /* para */ + 112, 97, 114, 116, /* part */ + 112, 101, 114, 109, 105, 108, /* permil */ + 112, 101, 114, 112, /* perp */ + 112, 104, 105, /* phi */ + 112, 105, /* pi */ + 112, 105, 118, /* piv */ + 112, 108, 117, 115, 109, 110, /* plusmn */ + 112, 111, 117, 110, 100, /* pound */ + 112, 114, 105, 109, 101, /* prime */ + 112, 114, 111, 100, /* prod */ + 112, 114, 111, 112, /* prop */ + 112, 115, 105, /* psi */ + 113, 117, 111, 116, /* quot */ + 114, 65, 114, 114, /* rArr */ + 114, 97, 100, 105, 99, /* radic */ + 114, 97, 110, 103, /* rang */ + 114, 97, 113, 117, 111, /* raquo */ + 114, 97, 114, 114, /* rarr */ + 114, 99, 101, 105, 108, /* rceil */ + 114, 100, 113, 117, 111, /* rdquo */ + 114, 101, 97, 108, /* real */ + 114, 101, 103, /* reg */ + 114, 102, 108, 111, 111, 114, /* rfloor */ + 114, 104, 111, /* rho */ + 114, 108, 109, /* rlm */ + 114, 115, 97, 113, 117, 111, /* rsaquo */ + 114, 115, 113, 117, 111, /* rsquo */ + 115, 98, 113, 117, 111, /* sbquo */ + 115, 99, 97, 114, 111, 110, /* scaron */ + 115, 100, 111, 116, /* sdot */ + 115, 101, 99, 116, /* sect */ + 115, 104, 121, /* shy */ + 115, 105, 103, 109, 97, /* sigma */ + 115, 105, 103, 109, 97, 102, /* sigmaf */ + 115, 105, 109, /* sim */ + 115, 112, 97, 100, 101, 115, /* spades */ + 115, 117, 98, /* sub */ + 115, 117, 98, 101, /* sube */ + 115, 117, 109, /* sum */ + 115, 117, 112, /* sup */ + 115, 117, 112, 49, /* sup1 */ + 115, 117, 112, 50, /* sup2 */ + 115, 117, 112, 51, /* sup3 */ + 115, 117, 112, 101, /* supe */ + 115, 122, 108, 105, 103, /* szlig */ + 116, 97, 117, /* tau */ + 116, 104, 101, 114, 101, 52, /* there4 */ + 116, 104, 101, 116, 97, /* theta */ + 116, 104, 101, 116, 97, 115, 121, 109, /* thetasym */ + 116, 104, 105, 110, 115, 112, /* thinsp */ + 116, 104, 111, 114, 110, /* thorn */ + 116, 105, 108, 100, 101, /* tilde */ + 116, 105, 109, 101, 115, /* times */ + 116, 114, 97, 100, 101, /* trade */ + 117, 65, 114, 114, /* uArr */ + 117, 97, 99, 117, 116, 101, /* uacute */ + 117, 97, 114, 114, /* uarr */ + 117, 99, 105, 114, 99, /* ucirc */ + 117, 103, 114, 97, 118, 101, /* ugrave */ + 117, 109, 108, /* uml */ + 117, 112, 115, 105, 104, /* upsih */ + 117, 112, 115, 105, 108, 111, 110, /* upsilon */ + 117, 117, 109, 108, /* uuml */ + 119, 101, 105, 101, 114, 112, /* weierp */ + 120, 105, /* xi */ + 121, 97, 99, 117, 116, 101, /* yacute */ + 121, 101, 110, /* yen */ + 121, 117, 109, 108, /* yuml */ + 122, 101, 116, 97, /* zeta */ + 122, 119, 106, /* zwj */ + 122, 119, 110, 106 /* zwnj */ +}; + +static const struct i ii[]={ + {0, 5, 198}, + {5, 6, 193}, + {11, 5, 194}, + {16, 6, 192}, + {22, 5, 913}, + {27, 5, 197}, + {32, 6, 195}, + {38, 4, 196}, + {42, 4, 914}, + {46, 6, 199}, + {52, 3, 935}, + {55, 6, 8225}, + {61, 5, 916}, + {66, 3, 208}, + {69, 6, 201}, + {75, 5, 202}, + {80, 6, 200}, + {86, 7, 917}, + {93, 3, 919}, + {96, 4, 203}, + {100, 5, 915}, + {105, 6, 205}, + {111, 5, 206}, + {116, 6, 204}, + {122, 4, 921}, + {126, 4, 207}, + {130, 5, 922}, + {135, 6, 923}, + {141, 2, 924}, + {143, 6, 209}, + {149, 2, 925}, + {151, 5, 338}, + {156, 6, 211}, + {162, 5, 212}, + {167, 6, 210}, + {173, 5, 937}, + {178, 7, 927}, + {185, 6, 216}, + {191, 6, 213}, + {197, 4, 214}, + {201, 3, 934}, + {204, 2, 928}, + {206, 5, 8243}, + {211, 3, 936}, + {214, 3, 929}, + {217, 6, 352}, + {223, 5, 931}, + {228, 5, 222}, + {233, 3, 932}, + {236, 5, 920}, + {241, 6, 218}, + {247, 5, 219}, + {252, 6, 217}, + {258, 7, 933}, + {265, 4, 220}, + {269, 2, 926}, + {271, 6, 221}, + {277, 4, 376}, + {281, 4, 918}, + {285, 6, 225}, + {291, 5, 226}, + {296, 5, 180}, + {301, 5, 230}, + {306, 6, 224}, + {312, 7, 8501}, + {319, 5, 945}, + {324, 3, 38}, + {327, 3, 8743}, + {330, 3, 8736}, + {333, 4, 39}, + {337, 5, 229}, + {342, 5, 8776}, + {347, 6, 227}, + {353, 4, 228}, + {357, 5, 8222}, + {362, 4, 946}, + {366, 6, 166}, + {372, 4, 8226}, + {376, 3, 8745}, + {379, 6, 231}, + {385, 5, 184}, + {390, 4, 162}, + {394, 3, 967}, + {397, 4, 710}, + {401, 5, 9827}, + {406, 4, 8773}, + {410, 4, 169}, + {414, 5, 8629}, + {419, 3, 8746}, + {422, 6, 164}, + {428, 4, 8659}, + {432, 6, 8224}, + {438, 4, 8595}, + {442, 3, 176}, + {445, 5, 948}, + {450, 5, 9830}, + {455, 6, 247}, + {461, 6, 233}, + {467, 5, 234}, + {472, 6, 232}, + {478, 5, 8709}, + {483, 4, 8195}, + {487, 4, 8194}, + {491, 7, 949}, + {498, 5, 8801}, + {503, 3, 951}, + {506, 3, 240}, + {509, 4, 235}, + {513, 4, 8364}, + {517, 5, 8707}, + {522, 4, 402}, + {526, 6, 8704}, + {532, 6, 189}, + {538, 6, 188}, + {544, 6, 190}, + {550, 5, 8260}, + {555, 5, 947}, + {560, 2, 8805}, + {562, 2, 62}, + {564, 4, 8660}, + {568, 4, 8596}, + {572, 6, 9829}, + {578, 6, 8230}, + {584, 6, 237}, + {590, 5, 238}, + {595, 5, 161}, + {600, 6, 236}, + {606, 5, 8465}, + {611, 5, 8734}, + {616, 3, 8747}, + {619, 4, 953}, + {623, 6, 191}, + {629, 4, 8712}, + {633, 4, 239}, + {637, 5, 954}, + {642, 4, 8656}, + {646, 6, 955}, + {652, 4, 9001}, + {656, 5, 171}, + {661, 4, 8592}, + {665, 5, 8968}, + {670, 5, 8220}, + {675, 2, 8804}, + {677, 6, 8970}, + {683, 6, 8727}, + {689, 3, 9674}, + {692, 3, 8206}, + {695, 6, 8249}, + {701, 5, 8216}, + {706, 2, 60}, + {708, 4, 175}, + {712, 5, 8212}, + {717, 5, 181}, + {722, 6, 183}, + {728, 5, 8722}, + {733, 2, 956}, + {735, 5, 8711}, + {740, 4, 160}, + {744, 5, 8211}, + {749, 2, 8800}, + {751, 2, 8715}, + {753, 3, 172}, + {756, 5, 8713}, + {761, 4, 8836}, + {765, 6, 241}, + {771, 2, 957}, + {773, 6, 243}, + {779, 5, 244}, + {784, 5, 339}, + {789, 6, 242}, + {795, 5, 8254}, + {800, 5, 969}, + {805, 7, 959}, + {812, 5, 8853}, + {817, 2, 8744}, + {819, 4, 170}, + {823, 4, 186}, + {827, 6, 248}, + {833, 6, 245}, + {839, 6, 8855}, + {845, 4, 246}, + {849, 4, 182}, + {853, 4, 8706}, + {857, 6, 8240}, + {863, 4, 8869}, + {867, 3, 966}, + {870, 2, 960}, + {872, 3, 982}, + {875, 6, 177}, + {881, 5, 163}, + {886, 5, 8242}, + {891, 4, 8719}, + {895, 4, 8733}, + {899, 3, 968}, + {902, 4, 34}, + {906, 4, 8658}, + {910, 5, 8730}, + {915, 4, 9002}, + {919, 5, 187}, + {924, 4, 8594}, + {928, 5, 8969}, + {933, 5, 8221}, + {938, 4, 8476}, + {942, 3, 174}, + {945, 6, 8971}, + {951, 3, 961}, + {954, 3, 8207}, + {957, 6, 8250}, + {963, 5, 8217}, + {968, 5, 8218}, + {973, 6, 353}, + {979, 4, 8901}, + {983, 4, 167}, + {987, 3, 173}, + {990, 5, 963}, + {995, 6, 962}, + {1001, 3, 8764}, + {1004, 6, 9824}, + {1010, 3, 8834}, + {1013, 4, 8838}, + {1017, 3, 8721}, + {1020, 3, 8835}, + {1023, 4, 185}, + {1027, 4, 178}, + {1031, 4, 179}, + {1035, 4, 8839}, + {1039, 5, 223}, + {1044, 3, 964}, + {1047, 6, 8756}, + {1053, 5, 952}, + {1058, 8, 977}, + {1066, 6, 8201}, + {1072, 5, 254}, + {1077, 5, 732}, + {1082, 5, 215}, + {1087, 5, 8482}, + {1092, 4, 8657}, + {1096, 6, 250}, + {1102, 4, 8593}, + {1106, 5, 251}, + {1111, 6, 249}, + {1117, 3, 168}, + {1120, 5, 978}, + {1125, 7, 965}, + {1132, 4, 252}, + {1136, 6, 8472}, + {1142, 2, 958}, + {1144, 6, 253}, + {1150, 3, 165}, + {1153, 4, 255}, + {1157, 4, 950}, + {1161, 3, 8205}, + {1164, 4, 8204} +}; diff --git a/unicode/unicode_linebreak.c b/unicode/unicode_linebreak.c new file mode 100644 index 0000000..1105dec --- /dev/null +++ b/unicode/unicode_linebreak.c @@ -0,0 +1,632 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +#include <unistd.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include "linebreaktab_internal.h" + +#include "linebreaktab.h" + +#define UNICODE_LB_SOT 0xFF + +struct unicode_lb_info { + int (*cb_func)(int, void *); + void *cb_arg; + + int opts; + + uint8_t savedclass; + size_t savedcmcnt; + + uint8_t prevclass; + uint8_t prevclass_nsp; + + int (*next_handler)(struct unicode_lb_info *, uint8_t); + int (*end_handler)(struct unicode_lb_info *); +}; + + +/* http://www.unicode.org/reports/tr14/#Algorithm */ + +static int next_def(unicode_lb_info_t, uint8_t); +static int end_def(unicode_lb_info_t); + +static int next_lb25_seenophy(unicode_lb_info_t, uint8_t); +static int end_lb25_seenophy(unicode_lb_info_t); + +static int next_lb25_seennu(unicode_lb_info_t, uint8_t); + +static int next_lb25_seennuclcp(unicode_lb_info_t, uint8_t); + +static void unicode_lb_reset(unicode_lb_info_t i) +{ + i->prevclass=i->prevclass_nsp=UNICODE_LB_SOT; + i->next_handler=next_def; + i->end_handler=end_def; +} + +unicode_lb_info_t unicode_lb_init(int (*cb_func)(int, void *), + void *cb_arg) +{ + unicode_lb_info_t i=calloc(1, sizeof(struct unicode_lb_info)); + + i->cb_func=cb_func; + i->cb_arg=cb_arg; + + unicode_lb_reset(i); + return i; +} + +int unicode_lb_end(unicode_lb_info_t i) +{ + int rc=(*i->end_handler)(i); + + free(i); + return rc; +} + +void unicode_lb_set_opts(unicode_lb_info_t i, int opts) +{ + i->opts=opts; +} + +/* Default end handler has nothing to do */ + +static int end_def(unicode_lb_info_t i) +{ + /* LB3 N/A */ + return 0; +} +#define RESULT(x) (*i->cb_func)((x), i->cb_arg) + +int unicode_lb_next_cnt(unicode_lb_info_t i, + const unicode_char *chars, + size_t cnt) +{ + while (cnt) + { + int rc=unicode_lb_next(i, *chars); + + if (rc) + return rc; + + ++chars; + --cnt; + } + return 0; +} + +int unicode_lb_lookup(unicode_char ch) +{ + return unicode_tab_lookup(ch, + unicode_indextab, + sizeof(unicode_indextab) + / sizeof(unicode_indextab[0]), + unicode_rangetab, + unicode_classtab, + UNICODE_LB_AL /* XX, LB1 */); +} + +int unicode_lb_next(unicode_lb_info_t i, + unicode_char ch) +{ + return (*i->next_handler)(i, (i->opts & UNICODE_LB_OPT_DASHWJ) && + (ch == 0x2012 || ch == 0x2013) + ? UNICODE_LB_WJ:unicode_lb_lookup(ch)); +} + +static int next_def_nolb25(unicode_lb_info_t i, + uint8_t uclass, + int nolb25); + +/* +** Default logic for next unicode char. +*/ +static int next_def(unicode_lb_info_t i, + uint8_t uclass) +{ + return next_def_nolb25(i, uclass, 0); +} + +static int next_def_nolb25(unicode_lb_info_t i, + uint8_t uclass, + + /* Flag -- recursively invoked after discarding LB25 */ + int nolb25) +{ + + /* Retrieve the previous unicode character's linebreak class. */ + + uint8_t prevclass=i->prevclass; + uint8_t prevclass_nsp=i->prevclass_nsp; + + /* Save this unicode char's linebreak class, for the next goaround */ + i->prevclass=uclass; + + if (uclass != UNICODE_LB_SP) + i->prevclass_nsp=uclass; + + if (uclass == UNICODE_LB_NU) + i->next_handler=next_lb25_seennu; /* LB25 */ + + if (prevclass == UNICODE_LB_SOT) + { + if (uclass == UNICODE_LB_CM) /* LB9 */ + i->prevclass=i->prevclass_nsp=uclass=UNICODE_LB_AL; + + return RESULT(UNICODE_LB_NONE); /* LB2 */ + } + + if (prevclass == UNICODE_LB_CR && uclass == UNICODE_LB_LF) + return RESULT(UNICODE_LB_NONE); /* LB5 */ + + switch (prevclass) { + case UNICODE_LB_BK: + case UNICODE_LB_CR: + case UNICODE_LB_LF: + case UNICODE_LB_NL: + + if (uclass == UNICODE_LB_CM) + { + i->prevclass=i->prevclass_nsp=uclass=UNICODE_LB_AL; + /* LB9 */ + } + + return RESULT(UNICODE_LB_MANDATORY); /* LB4, LB5 */ + + case UNICODE_LB_SP: + case UNICODE_LB_ZW: + if (uclass == UNICODE_LB_CM) + i->prevclass=i->prevclass_nsp=uclass=UNICODE_LB_AL; + /* LB10 */ + break; + default: + break; + } + + switch (uclass) { + + /* LB6: */ + case UNICODE_LB_BK: + case UNICODE_LB_CR: + case UNICODE_LB_LF: + case UNICODE_LB_NL: + + /* LB7: */ + case UNICODE_LB_SP: + case UNICODE_LB_ZW: + + return RESULT(UNICODE_LB_NONE); + default: + break; + } + + if (prevclass_nsp == UNICODE_LB_ZW) + return RESULT(UNICODE_LB_ALLOWED); /* LB8 */ + + if (uclass == UNICODE_LB_CM) + { + i->prevclass=prevclass; + i->prevclass_nsp=prevclass_nsp; + return RESULT(UNICODE_LB_NONE); /* LB9 */ + } + + if (prevclass == UNICODE_LB_WJ || uclass == UNICODE_LB_WJ) + return RESULT(UNICODE_LB_NONE); /* LB11 */ + + if (prevclass == UNICODE_LB_GL) + return RESULT(UNICODE_LB_NONE); /* LB12 */ + + if (uclass == UNICODE_LB_GL && + prevclass != UNICODE_LB_SP && + prevclass != UNICODE_LB_BA && + prevclass != UNICODE_LB_HY) + return RESULT(UNICODE_LB_NONE); /* LB12a */ + + + switch (uclass) { + case UNICODE_LB_SY: + if (i->opts & UNICODE_LB_OPT_SYBREAK) + { + if (prevclass == UNICODE_LB_SP) + return RESULT(UNICODE_LB_ALLOWED); + } + + case UNICODE_LB_CL: + case UNICODE_LB_CP: + case UNICODE_LB_EX: + case UNICODE_LB_IS: + return RESULT(UNICODE_LB_NONE); /* LB13 */ + default: + break; + } + + if ((i->opts & UNICODE_LB_OPT_SYBREAK) && prevclass == UNICODE_LB_SY) + switch (uclass) { + case UNICODE_LB_EX: + case UNICODE_LB_AL: + case UNICODE_LB_ID: + return RESULT(UNICODE_LB_NONE); + } + + if (prevclass_nsp == UNICODE_LB_OP) + return RESULT(UNICODE_LB_NONE); /* LB14 */ + + if (prevclass_nsp == UNICODE_LB_QU && uclass == UNICODE_LB_OP) + return RESULT(UNICODE_LB_NONE); /* LB15 */ + + if ((prevclass_nsp == UNICODE_LB_CL || prevclass_nsp == UNICODE_LB_CP) + && uclass == UNICODE_LB_NS) + return RESULT(UNICODE_LB_NONE); /* LB16 */ + + if (prevclass_nsp == UNICODE_LB_B2 && uclass == UNICODE_LB_B2) + return RESULT(UNICODE_LB_NONE); /* LB17 */ + + if (prevclass == UNICODE_LB_SP) + return RESULT(UNICODE_LB_ALLOWED); /* LB18 */ + + if (uclass == UNICODE_LB_QU || prevclass == UNICODE_LB_QU) + return RESULT(UNICODE_LB_NONE); /* LB19 */ + + if (uclass == UNICODE_LB_CB || prevclass == UNICODE_LB_CB) + return RESULT(UNICODE_LB_ALLOWED); /* LB20 */ + + /* LB21: */ + + switch (uclass) { + case UNICODE_LB_BA: + case UNICODE_LB_HY: + case UNICODE_LB_NS: + return RESULT(UNICODE_LB_NONE); + default: + break; + } + + if (prevclass == UNICODE_LB_BB) + return RESULT(UNICODE_LB_NONE); + + if (uclass == UNICODE_LB_IN) + switch (prevclass) { + case UNICODE_LB_AL: + case UNICODE_LB_ID: + case UNICODE_LB_IN: + case UNICODE_LB_NU: + return RESULT(UNICODE_LB_NONE); /* LB22 */ + default: + break; + } + + + if (prevclass == UNICODE_LB_ID && uclass == UNICODE_LB_PO) + return RESULT(UNICODE_LB_NONE); /* LB23 */ + if (prevclass == UNICODE_LB_AL && uclass == UNICODE_LB_NU) + return RESULT(UNICODE_LB_NONE); /* LB23 */ + + if (prevclass == UNICODE_LB_NU && uclass == UNICODE_LB_AL) + return RESULT(UNICODE_LB_NONE); /* LB23 */ + + + if (prevclass == UNICODE_LB_PR && uclass == UNICODE_LB_ID) + return RESULT(UNICODE_LB_NONE); /* LB24 */ + if (prevclass == UNICODE_LB_PR && uclass == UNICODE_LB_AL) + return RESULT(UNICODE_LB_NONE); /* LB24 */ + if (prevclass == UNICODE_LB_PO && uclass == UNICODE_LB_AL) + return RESULT(UNICODE_LB_NONE); /* LB24 */ + + if ((i->opts & UNICODE_LB_OPT_PRBREAK) && uclass == UNICODE_LB_PR) + switch (prevclass) { + case UNICODE_LB_PR: + case UNICODE_LB_AL: + case UNICODE_LB_ID: + return RESULT(UNICODE_LB_NONE); + } + + if (!nolb25 && + (prevclass == UNICODE_LB_PR || prevclass == UNICODE_LB_PO)) + { + if (uclass == UNICODE_LB_NU) + return RESULT(UNICODE_LB_NONE); /* LB25 */ + + if (uclass == UNICODE_LB_OP || uclass == UNICODE_LB_HY) + { + i->prevclass=prevclass; + i->prevclass_nsp=prevclass_nsp; + + i->savedclass=uclass; + i->savedcmcnt=0; + i->next_handler=next_lb25_seenophy; + i->end_handler=end_lb25_seenophy; + return 0; + } + } + + if ((prevclass == UNICODE_LB_OP || prevclass == UNICODE_LB_HY) && + uclass == UNICODE_LB_NU) + return RESULT(UNICODE_LB_NONE); /* LB25 */ + + /*****/ + + if (prevclass == UNICODE_LB_JL) + switch (uclass) { + case UNICODE_LB_JL: + case UNICODE_LB_JV: + case UNICODE_LB_H2: + case UNICODE_LB_H3: + return RESULT(UNICODE_LB_NONE); /* LB26 */ + default: + break; + } + + if ((prevclass == UNICODE_LB_JV || + prevclass == UNICODE_LB_H2) && + (uclass == UNICODE_LB_JV || + uclass == UNICODE_LB_JT)) + return RESULT(UNICODE_LB_NONE); /* LB26 */ + + if ((prevclass == UNICODE_LB_JT || + prevclass == UNICODE_LB_H3) && + uclass == UNICODE_LB_JT) + return RESULT(UNICODE_LB_NONE); /* LB26 */ + + + switch (prevclass) { + case UNICODE_LB_JL: + case UNICODE_LB_JV: + case UNICODE_LB_JT: + case UNICODE_LB_H2: + case UNICODE_LB_H3: + if (uclass == UNICODE_LB_IN || uclass == UNICODE_LB_PO) + return RESULT(UNICODE_LB_NONE); /* LB27 */ + default: + break; + } + + switch (uclass) { + case UNICODE_LB_JL: + case UNICODE_LB_JV: + case UNICODE_LB_JT: + case UNICODE_LB_H2: + case UNICODE_LB_H3: + if (prevclass == UNICODE_LB_PR) + return RESULT(UNICODE_LB_NONE); /* LB27 */ + default: + break; + } + + if (prevclass == UNICODE_LB_AL && uclass == UNICODE_LB_AL) + return RESULT(UNICODE_LB_NONE); /* LB28 */ + + if (prevclass == UNICODE_LB_IS && uclass == UNICODE_LB_AL) + return RESULT(UNICODE_LB_NONE); /* LB29 */ + + if ((prevclass == UNICODE_LB_AL || prevclass == UNICODE_LB_NU) && + uclass == UNICODE_LB_OP) + return RESULT(UNICODE_LB_NONE); /* LB30 */ + + if ((uclass == UNICODE_LB_AL || uclass == UNICODE_LB_NU) && + prevclass == UNICODE_LB_CP) + return RESULT(UNICODE_LB_NONE); /* LB30 */ + + return RESULT(UNICODE_LB_ALLOWED); /* LB31 */ +} + +/* +** Seen (PR|PO)(OP|HY), without returning the linebreak property for the second +** character, but NU did not follow. Backtrack. +*/ + +static int unwind_lb25_seenophy(unicode_lb_info_t i) +{ + int rc; + + /*uint8_t class=i->savedclass;*/ + int nolb25_flag=1; + + i->next_handler=next_def; + i->end_handler=end_def; + + do + { + rc=next_def_nolb25(i, i->savedclass, nolb25_flag); + + if (rc) + return rc; + + /*class=UNICODE_LB_CM;*/ + nolb25_flag=0; + } while (i->savedcmcnt--); + return 0; +} + +/* +** Seen (PR|PO)(OP|HY), without returning the linebreak property for the second +** character. If there's now a NU, we found the modified LB25 regexp. +*/ + +static int next_lb25_seenophy(unicode_lb_info_t i, + uint8_t uclass) +{ + int rc; + + if (uclass == UNICODE_LB_CM) + { + ++i->savedcmcnt; /* Keep track of CMs, and try again */ + return 0; + } + + if (uclass != UNICODE_LB_NU) + { + rc=unwind_lb25_seenophy(i); + + if (rc) + return rc; + + return next_def_nolb25(i, uclass, 0); + } + + do + { + rc=RESULT(UNICODE_LB_NONE); /* (OP|HY) feedback */ + + if (rc) + return rc; + } while (i->savedcmcnt--); + + i->next_handler=next_lb25_seennu; + i->end_handler=end_def; + i->prevclass=i->prevclass_nsp=uclass; + return RESULT(UNICODE_LB_NONE); +} + +/* +** Seen (PR|PO)(OP|HY), and now The End. Unwind, and give up. +*/ + +static int end_lb25_seenophy(unicode_lb_info_t i) +{ + int rc=unwind_lb25_seenophy(i); + + if (rc == 0) + rc=end_def(i); + return rc; +} + +/* +** Seen an NU, modified LB25 regexp. +*/ +static int next_lb25_seennu(unicode_lb_info_t i, uint8_t uclass) +{ + if (uclass == UNICODE_LB_NU || uclass == UNICODE_LB_SY || + uclass == UNICODE_LB_IS) + { + i->prevclass=i->prevclass_nsp=uclass; + return RESULT(UNICODE_LB_NONE); + } + + if (uclass == UNICODE_LB_CM) + return RESULT(UNICODE_LB_NONE); /* LB9 */ + + if (uclass == UNICODE_LB_CL || uclass == UNICODE_LB_CP) + { + i->prevclass=i->prevclass_nsp=uclass; + i->next_handler=next_lb25_seennuclcp; + i->end_handler=end_def; + return RESULT(UNICODE_LB_NONE); + } + + i->next_handler=next_def; + i->end_handler=end_def; + + if (uclass == UNICODE_LB_PR || uclass == UNICODE_LB_PO) + { + i->prevclass=i->prevclass_nsp=uclass; + return RESULT(UNICODE_LB_NONE); + } + + return next_def(i, uclass); /* Not a prefix, process normally */ +} + +/* +** Seen CL|CP, in the modified LB25 regexp. +*/ +static int next_lb25_seennuclcp(unicode_lb_info_t i, uint8_t uclass) +{ + if (uclass == UNICODE_LB_CM) + return RESULT(UNICODE_LB_NONE); /* LB9 */ + + i->next_handler=next_def; + i->end_handler=end_def; + + if (uclass == UNICODE_LB_PR || uclass == UNICODE_LB_PO) + { + i->prevclass=i->prevclass_nsp=uclass; + + return RESULT(UNICODE_LB_NONE); + } + + return next_def(i, uclass); +} + +/******************/ + +struct unicode_lbc_info { + unicode_lb_info_t handle; + + struct unicode_buf buf; + + size_t buf_ptr; + + int (*cb_func)(int, unicode_char, void *); + void *cb_arg; +}; + +static int unicode_lbc_callback(int value, void *ptr) +{ + unicode_lbc_info_t h=(unicode_lbc_info_t)ptr; + + if (h->buf_ptr >= unicode_buf_len(&h->buf)) + { + errno=EINVAL; + return -1; /* Shouldn't happen */ + } + + return (*h->cb_func)(value, unicode_buf_ptr(&h->buf)[h->buf_ptr++], + h->cb_arg); +} + +unicode_lbc_info_t unicode_lbc_init(int (*cb_func)(int, unicode_char, void *), + void *cb_arg) +{ + unicode_lbc_info_t h= + (unicode_lbc_info_t)calloc(1, sizeof(struct unicode_lbc_info)); + + if (!h) + return NULL; + + h->cb_func=cb_func; + h->cb_arg=cb_arg; + + if ((h->handle=unicode_lb_init(unicode_lbc_callback, h)) == NULL) + { + free(h); + return NULL; + } + unicode_buf_init(&h->buf, (size_t)-1); + return h; +} + +void unicode_lbc_set_opts(unicode_lbc_info_t i, int opts) +{ + unicode_lb_set_opts(i->handle, opts); +} + +int unicode_lbc_next(unicode_lbc_info_t i, unicode_char ch) +{ + if (i->buf_ptr >= unicode_buf_len(&i->buf)) + { + i->buf_ptr=0; + unicode_buf_clear(&i->buf); + } + + unicode_buf_append(&i->buf, &ch, 1); + return unicode_lb_next(i->handle, ch); +} + +int unicode_lbc_end(unicode_lbc_info_t i) +{ + int rc=unicode_lb_end(i->handle); + + unicode_buf_deinit(&i->buf); + free(i); + return rc; +} diff --git a/unicode/unicode_tablookup.c b/unicode/unicode_tablookup.c new file mode 100644 index 0000000..c61526d --- /dev/null +++ b/unicode/unicode_tablookup.c @@ -0,0 +1,49 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +#define BLOCK_SIZE 256 + +uint8_t unicode_tab_lookup(unicode_char ch, + const size_t *unicode_indextab, + size_t unicode_indextab_sizeof, + const uint8_t (*unicode_rangetab)[2], + const uint8_t *unicode_classtab, + uint8_t uclass) +{ + size_t cl=ch / BLOCK_SIZE; + + if (cl < unicode_indextab_sizeof-1) + { + const size_t start_pos=unicode_indextab[cl]; + const uint8_t (*p)[2]=unicode_rangetab + start_pos; + size_t b=0, e=unicode_indextab[cl+1] - start_pos; + uint8_t chmodcl= ch & (BLOCK_SIZE-1); + + while (b < e) + { + size_t n=b + (e-b)/2; + + if (chmodcl >= p[n][0]) + { + if (chmodcl <= p[n][1]) + { + uclass=unicode_classtab[start_pos+n]; + break; + } + b=n+1; + } + else + { + e=n; + } + } + } + + return uclass; +} diff --git a/unicode/unicode_ultcase.c b/unicode/unicode_ultcase.c new file mode 100644 index 0000000..e0c339e --- /dev/null +++ b/unicode/unicode_ultcase.c @@ -0,0 +1,57 @@ +/* +** Copyright 2000-2003 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +extern const unsigned unicode_case_hash; +extern const unicode_char unicode_case_tab[][4]; +extern const unsigned unicode_case_offset[]; + +static unsigned find_case(unicode_char c) +{ + unsigned idx= c % unicode_case_hash; + + unsigned i=unicode_case_offset[idx]; + + unicode_char uc; + + --i; + + do + { + uc=unicode_case_tab[++i][0]; + if (uc == c) + return (i); + } while ( (uc % unicode_case_hash) == idx); + + return (0); +} + +unicode_char unicode_uc(unicode_char c) +{ + unsigned i=find_case(c); + + return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][1]); +} + +unicode_char unicode_lc(unicode_char c) +{ + unsigned i=find_case(c); + + return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][2]); +} + +unicode_char unicode_tc(unicode_char c) +{ + unsigned i; + unicode_char oc=c; + + c=unicode_lc(c); + i=find_case(c); + + return (unicode_case_tab[i][0] != c ? oc:unicode_case_tab[i][3]); +} diff --git a/unicode/unicode_ultcasetab.c b/unicode/unicode_ultcasetab.c new file mode 100644 index 0000000..ae75340 --- /dev/null +++ b/unicode/unicode_ultcasetab.c @@ -0,0 +1,663 @@ +/* +** Copyright 2000-2004 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode.h" + +const unsigned unicode_case_hash=2048; +/* unicode_case_maxbucket=5*/ +const unicode_char unicode_case_tab[][4]={ +{0x0041,0x0041,0x0061,0x0041},{0x0042,0x0042,0x0062,0x0042},{0x0043,0x0043,0x0063,0x0043},{0x0044,0x0044,0x0064,0x0044}, +{0x0045,0x0045,0x0065,0x0045},{0x0046,0x0046,0x0066,0x0046},{0x0047,0x0047,0x0067,0x0047},{0x0048,0x0048,0x0068,0x0048}, +{0x0049,0x0049,0x0069,0x0049},{0x004a,0x004a,0x006a,0x004a},{0x004b,0x004b,0x006b,0x004b},{0x004c,0x004c,0x006c,0x004c}, +{0x004d,0x004d,0x006d,0x004d},{0x004e,0x004e,0x006e,0x004e},{0x004f,0x004f,0x006f,0x004f},{0x0050,0x0050,0x0070,0x0050}, +{0x0051,0x0051,0x0071,0x0051},{0x0052,0x0052,0x0072,0x0052},{0x0053,0x0053,0x0073,0x0053},{0x0054,0x0054,0x0074,0x0054}, +{0x0055,0x0055,0x0075,0x0055},{0x0056,0x0056,0x0076,0x0056},{0x0057,0x0057,0x0077,0x0057},{0x0058,0x0058,0x0078,0x0058}, +{0x0059,0x0059,0x0079,0x0059},{0x005a,0x005a,0x007a,0x005a},{0x0061,0x0041,0x0061,0x0041},{0x0062,0x0042,0x0062,0x0042}, +{0x0063,0x0043,0x0063,0x0043},{0x0064,0x0044,0x0064,0x0044},{0x0065,0x0045,0x0065,0x0045},{0x0066,0x0046,0x0066,0x0046}, +{0x0067,0x0047,0x0067,0x0047},{0x0068,0x0048,0x0068,0x0048},{0x0069,0x0049,0x0069,0x0049},{0x006a,0x004a,0x006a,0x004a}, +{0x006b,0x004b,0x006b,0x004b},{0x006c,0x004c,0x006c,0x004c},{0x006d,0x004d,0x006d,0x004d},{0x006e,0x004e,0x006e,0x004e}, +{0x006f,0x004f,0x006f,0x004f},{0x0070,0x0050,0x0070,0x0050},{0x0071,0x0051,0x0071,0x0051},{0x0072,0x0052,0x0072,0x0052}, +{0x0073,0x0053,0x0073,0x0053},{0x0074,0x0054,0x0074,0x0054},{0x0075,0x0055,0x0075,0x0055},{0x0076,0x0056,0x0076,0x0056}, +{0x0077,0x0057,0x0077,0x0057},{0x0078,0x0058,0x0078,0x0058},{0x0079,0x0059,0x0079,0x0059},{0x007a,0x005a,0x007a,0x005a}, +{0x10a0,0x10a0,0x2d00,0x10a0},{0x10a1,0x10a1,0x2d01,0x10a1},{0x10a2,0x10a2,0x2d02,0x10a2},{0x10a3,0x10a3,0x2d03,0x10a3}, +{0x10a4,0x10a4,0x2d04,0x10a4},{0x10a5,0x10a5,0x2d05,0x10a5},{0x10a6,0x10a6,0x2d06,0x10a6},{0x10a7,0x10a7,0x2d07,0x10a7}, +{0x10a8,0x10a8,0x2d08,0x10a8},{0x10a9,0x10a9,0x2d09,0x10a9},{0x10aa,0x10aa,0x2d0a,0x10aa},{0x10ab,0x10ab,0x2d0b,0x10ab}, +{0x10ac,0x10ac,0x2d0c,0x10ac},{0x10ad,0x10ad,0x2d0d,0x10ad},{0x10ae,0x10ae,0x2d0e,0x10ae},{0x10af,0x10af,0x2d0f,0x10af}, +{0x10b0,0x10b0,0x2d10,0x10b0},{0x10b1,0x10b1,0x2d11,0x10b1},{0x10b2,0x10b2,0x2d12,0x10b2},{0x10b3,0x10b3,0x2d13,0x10b3}, +{0x10b4,0x10b4,0x2d14,0x10b4},{0x00b5,0x039c,0x00b5,0x039c},{0x10b5,0x10b5,0x2d15,0x10b5},{0x10b6,0x10b6,0x2d16,0x10b6}, +{0x10b7,0x10b7,0x2d17,0x10b7},{0x10b8,0x10b8,0x2d18,0x10b8},{0x10b9,0x10b9,0x2d19,0x10b9},{0x10ba,0x10ba,0x2d1a,0x10ba}, +{0x10bb,0x10bb,0x2d1b,0x10bb},{0x10bc,0x10bc,0x2d1c,0x10bc},{0x10bd,0x10bd,0x2d1d,0x10bd},{0x10be,0x10be,0x2d1e,0x10be}, +{0x10bf,0x10bf,0x2d1f,0x10bf},{0x00c0,0x00c0,0x00e0,0x00c0},{0x10c0,0x10c0,0x2d20,0x10c0},{0x00c1,0x00c1,0x00e1,0x00c1}, +{0x10c1,0x10c1,0x2d21,0x10c1},{0x00c2,0x00c2,0x00e2,0x00c2},{0x10c2,0x10c2,0x2d22,0x10c2},{0x10c3,0x10c3,0x2d23,0x10c3}, +{0x00c3,0x00c3,0x00e3,0x00c3},{0x10c4,0x10c4,0x2d24,0x10c4},{0x00c4,0x00c4,0x00e4,0x00c4},{0x10c5,0x10c5,0x2d25,0x10c5}, +{0x00c5,0x00c5,0x00e5,0x00c5},{0x00c6,0x00c6,0x00e6,0x00c6},{0x00c7,0x00c7,0x00e7,0x00c7},{0x00c8,0x00c8,0x00e8,0x00c8}, +{0x00c9,0x00c9,0x00e9,0x00c9},{0x00ca,0x00ca,0x00ea,0x00ca},{0x00cb,0x00cb,0x00eb,0x00cb},{0x00cc,0x00cc,0x00ec,0x00cc}, +{0x00cd,0x00cd,0x00ed,0x00cd},{0x00ce,0x00ce,0x00ee,0x00ce},{0x00cf,0x00cf,0x00ef,0x00cf},{0x00d0,0x00d0,0x00f0,0x00d0}, +{0x00d1,0x00d1,0x00f1,0x00d1},{0x00d2,0x00d2,0x00f2,0x00d2},{0x00d3,0x00d3,0x00f3,0x00d3},{0x00d4,0x00d4,0x00f4,0x00d4}, +{0x00d5,0x00d5,0x00f5,0x00d5},{0x00d6,0x00d6,0x00f6,0x00d6},{0x00d8,0x00d8,0x00f8,0x00d8},{0x00d9,0x00d9,0x00f9,0x00d9}, +{0x00da,0x00da,0x00fa,0x00da},{0x00db,0x00db,0x00fb,0x00db},{0x00dc,0x00dc,0x00fc,0x00dc},{0x00dd,0x00dd,0x00fd,0x00dd}, +{0x00de,0x00de,0x00fe,0x00de},{0x00e0,0x00c0,0x00e0,0x00c0},{0x00e1,0x00c1,0x00e1,0x00c1},{0x00e2,0x00c2,0x00e2,0x00c2}, +{0x00e3,0x00c3,0x00e3,0x00c3},{0x00e4,0x00c4,0x00e4,0x00c4},{0x00e5,0x00c5,0x00e5,0x00c5},{0x00e6,0x00c6,0x00e6,0x00c6}, +{0x00e7,0x00c7,0x00e7,0x00c7},{0x00e8,0x00c8,0x00e8,0x00c8},{0x00e9,0x00c9,0x00e9,0x00c9},{0x00ea,0x00ca,0x00ea,0x00ca}, +{0x00eb,0x00cb,0x00eb,0x00cb},{0x00ec,0x00cc,0x00ec,0x00cc},{0x00ed,0x00cd,0x00ed,0x00cd},{0x00ee,0x00ce,0x00ee,0x00ce}, +{0x00ef,0x00cf,0x00ef,0x00cf},{0x00f0,0x00d0,0x00f0,0x00d0},{0x00f1,0x00d1,0x00f1,0x00d1},{0x00f2,0x00d2,0x00f2,0x00d2}, +{0x00f3,0x00d3,0x00f3,0x00d3},{0x00f4,0x00d4,0x00f4,0x00d4},{0x00f5,0x00d5,0x00f5,0x00d5},{0x00f6,0x00d6,0x00f6,0x00d6}, +{0x00f8,0x00d8,0x00f8,0x00d8},{0x00f9,0x00d9,0x00f9,0x00d9},{0x00fa,0x00da,0x00fa,0x00da},{0x00fb,0x00db,0x00fb,0x00db}, +{0x00fc,0x00dc,0x00fc,0x00dc},{0x00fd,0x00dd,0x00fd,0x00dd},{0x00fe,0x00de,0x00fe,0x00de},{0x00ff,0x0178,0x00ff,0x0178}, +{0x0100,0x0100,0x0101,0x0100},{0x0101,0x0100,0x0101,0x0100},{0x0102,0x0102,0x0103,0x0102},{0x0103,0x0102,0x0103,0x0102}, +{0x0104,0x0104,0x0105,0x0104},{0x0105,0x0104,0x0105,0x0104},{0x0106,0x0106,0x0107,0x0106},{0x0107,0x0106,0x0107,0x0106}, +{0x0108,0x0108,0x0109,0x0108},{0x0109,0x0108,0x0109,0x0108},{0x010a,0x010a,0x010b,0x010a},{0x010b,0x010a,0x010b,0x010a}, +{0x010c,0x010c,0x010d,0x010c},{0x010d,0x010c,0x010d,0x010c},{0x010e,0x010e,0x010f,0x010e},{0x010f,0x010e,0x010f,0x010e}, +{0x0110,0x0110,0x0111,0x0110},{0x0111,0x0110,0x0111,0x0110},{0x0112,0x0112,0x0113,0x0112},{0x0113,0x0112,0x0113,0x0112}, +{0x0114,0x0114,0x0115,0x0114},{0x0115,0x0114,0x0115,0x0114},{0x0116,0x0116,0x0117,0x0116},{0x0117,0x0116,0x0117,0x0116}, +{0x0118,0x0118,0x0119,0x0118},{0x0119,0x0118,0x0119,0x0118},{0x011a,0x011a,0x011b,0x011a},{0x011b,0x011a,0x011b,0x011a}, +{0x011c,0x011c,0x011d,0x011c},{0x011d,0x011c,0x011d,0x011c},{0x011e,0x011e,0x011f,0x011e},{0x011f,0x011e,0x011f,0x011e}, +{0x0120,0x0120,0x0121,0x0120},{0x0121,0x0120,0x0121,0x0120},{0x0122,0x0122,0x0123,0x0122},{0x0123,0x0122,0x0123,0x0122}, +{0x0124,0x0124,0x0125,0x0124},{0x0125,0x0124,0x0125,0x0124},{0x0126,0x0126,0x0127,0x0126},{0x2126,0x2126,0x03c9,0x2126}, +{0x0127,0x0126,0x0127,0x0126},{0x0128,0x0128,0x0129,0x0128},{0x0129,0x0128,0x0129,0x0128},{0x212a,0x212a,0x006b,0x212a}, +{0x012a,0x012a,0x012b,0x012a},{0x012b,0x012a,0x012b,0x012a},{0x212b,0x212b,0x00e5,0x212b},{0x012c,0x012c,0x012d,0x012c}, +{0x012d,0x012c,0x012d,0x012c},{0x012e,0x012e,0x012f,0x012e},{0x012f,0x012e,0x012f,0x012e},{0x0130,0x0130,0x0069,0x0130}, +{0x0131,0x0049,0x0131,0x0049},{0x2132,0x2132,0x214e,0x2132},{0x0132,0x0132,0x0133,0x0132},{0x0133,0x0132,0x0133,0x0132}, +{0x0134,0x0134,0x0135,0x0134},{0x0135,0x0134,0x0135,0x0134},{0x0136,0x0136,0x0137,0x0136},{0x0137,0x0136,0x0137,0x0136}, +{0x0139,0x0139,0x013a,0x0139},{0x013a,0x0139,0x013a,0x0139},{0x013b,0x013b,0x013c,0x013b},{0x013c,0x013b,0x013c,0x013b}, +{0x013d,0x013d,0x013e,0x013d},{0x013e,0x013d,0x013e,0x013d},{0x013f,0x013f,0x0140,0x013f},{0x0140,0x013f,0x0140,0x013f}, +{0x0141,0x0141,0x0142,0x0141},{0x0142,0x0141,0x0142,0x0141},{0x0143,0x0143,0x0144,0x0143},{0x0144,0x0143,0x0144,0x0143}, +{0x0145,0x0145,0x0146,0x0145},{0x0146,0x0145,0x0146,0x0145},{0x0147,0x0147,0x0148,0x0147},{0x0148,0x0147,0x0148,0x0147}, +{0x014a,0x014a,0x014b,0x014a},{0x014b,0x014a,0x014b,0x014a},{0x014c,0x014c,0x014d,0x014c},{0x014d,0x014c,0x014d,0x014c}, +{0x014e,0x014e,0x014f,0x014e},{0x214e,0x2132,0x214e,0x2132},{0x014f,0x014e,0x014f,0x014e},{0x0150,0x0150,0x0151,0x0150}, +{0x0151,0x0150,0x0151,0x0150},{0x0152,0x0152,0x0153,0x0152},{0x0153,0x0152,0x0153,0x0152},{0x0154,0x0154,0x0155,0x0154}, +{0x0155,0x0154,0x0155,0x0154},{0x0156,0x0156,0x0157,0x0156},{0x0157,0x0156,0x0157,0x0156},{0x0158,0x0158,0x0159,0x0158}, +{0x0159,0x0158,0x0159,0x0158},{0x015a,0x015a,0x015b,0x015a},{0x015b,0x015a,0x015b,0x015a},{0x015c,0x015c,0x015d,0x015c}, +{0x015d,0x015c,0x015d,0x015c},{0x015e,0x015e,0x015f,0x015e},{0x015f,0x015e,0x015f,0x015e},{0x2160,0x2160,0x2170,0x2160}, +{0x0160,0x0160,0x0161,0x0160},{0x0161,0x0160,0x0161,0x0160},{0x2161,0x2161,0x2171,0x2161},{0x2162,0x2162,0x2172,0x2162}, +{0x0162,0x0162,0x0163,0x0162},{0x2163,0x2163,0x2173,0x2163},{0x0163,0x0162,0x0163,0x0162},{0x0164,0x0164,0x0165,0x0164}, +{0x2164,0x2164,0x2174,0x2164},{0x2165,0x2165,0x2175,0x2165},{0x0165,0x0164,0x0165,0x0164},{0x2166,0x2166,0x2176,0x2166}, +{0x0166,0x0166,0x0167,0x0166},{0x2167,0x2167,0x2177,0x2167},{0x0167,0x0166,0x0167,0x0166},{0x0168,0x0168,0x0169,0x0168}, +{0x2168,0x2168,0x2178,0x2168},{0x0169,0x0168,0x0169,0x0168},{0x2169,0x2169,0x2179,0x2169},{0x216a,0x216a,0x217a,0x216a}, +{0x016a,0x016a,0x016b,0x016a},{0x216b,0x216b,0x217b,0x216b},{0x016b,0x016a,0x016b,0x016a},{0x216c,0x216c,0x217c,0x216c}, +{0x016c,0x016c,0x016d,0x016c},{0x216d,0x216d,0x217d,0x216d},{0x016d,0x016c,0x016d,0x016c},{0x216e,0x216e,0x217e,0x216e}, +{0x016e,0x016e,0x016f,0x016e},{0x016f,0x016e,0x016f,0x016e},{0x216f,0x216f,0x217f,0x216f},{0x2170,0x2160,0x2170,0x2160}, +{0x0170,0x0170,0x0171,0x0170},{0x2171,0x2161,0x2171,0x2161},{0x0171,0x0170,0x0171,0x0170},{0x0172,0x0172,0x0173,0x0172}, +{0x2172,0x2162,0x2172,0x2162},{0x2173,0x2163,0x2173,0x2163},{0x0173,0x0172,0x0173,0x0172},{0x2174,0x2164,0x2174,0x2164}, +{0x0174,0x0174,0x0175,0x0174},{0x0175,0x0174,0x0175,0x0174},{0x2175,0x2165,0x2175,0x2165},{0x2176,0x2166,0x2176,0x2166}, +{0x0176,0x0176,0x0177,0x0176},{0x0177,0x0176,0x0177,0x0176},{0x2177,0x2167,0x2177,0x2167},{0x0178,0x0178,0x00ff,0x0178}, +{0x2178,0x2168,0x2178,0x2168},{0x2179,0x2169,0x2179,0x2169},{0x0179,0x0179,0x017a,0x0179},{0x217a,0x216a,0x217a,0x216a}, +{0x017a,0x0179,0x017a,0x0179},{0x217b,0x216b,0x217b,0x216b},{0x017b,0x017b,0x017c,0x017b},{0x217c,0x216c,0x217c,0x216c}, +{0x017c,0x017b,0x017c,0x017b},{0x217d,0x216d,0x217d,0x216d},{0x017d,0x017d,0x017e,0x017d},{0x017e,0x017d,0x017e,0x017d}, +{0x217e,0x216e,0x217e,0x216e},{0x017f,0x0053,0x017f,0x0053},{0x217f,0x216f,0x217f,0x216f},{0x0180,0x0243,0x0180,0x0243}, +{0x0181,0x0181,0x0253,0x0181},{0x0182,0x0182,0x0183,0x0182},{0x0183,0x0182,0x0183,0x0182},{0x2183,0x2183,0x2184,0x2183}, +{0x0184,0x0184,0x0185,0x0184},{0x2184,0x2183,0x2184,0x2183},{0x0185,0x0184,0x0185,0x0184},{0x0186,0x0186,0x0254,0x0186}, +{0x0187,0x0187,0x0188,0x0187},{0x0188,0x0187,0x0188,0x0187},{0x0189,0x0189,0x0256,0x0189},{0x018a,0x018a,0x0257,0x018a}, +{0x018b,0x018b,0x018c,0x018b},{0x018c,0x018b,0x018c,0x018b},{0x018e,0x018e,0x01dd,0x018e},{0x018f,0x018f,0x0259,0x018f}, +{0x0190,0x0190,0x025b,0x0190},{0x0191,0x0191,0x0192,0x0191},{0x0192,0x0191,0x0192,0x0191},{0x0193,0x0193,0x0260,0x0193}, +{0x0194,0x0194,0x0263,0x0194},{0x0195,0x01f6,0x0195,0x01f6},{0x0196,0x0196,0x0269,0x0196},{0x0197,0x0197,0x0268,0x0197}, +{0x0198,0x0198,0x0199,0x0198},{0x0199,0x0198,0x0199,0x0198},{0x019a,0x023d,0x019a,0x023d},{0x019c,0x019c,0x026f,0x019c}, +{0x019d,0x019d,0x0272,0x019d},{0x019e,0x0220,0x019e,0x0220},{0x019f,0x019f,0x0275,0x019f},{0x01a0,0x01a0,0x01a1,0x01a0}, +{0x01a1,0x01a0,0x01a1,0x01a0},{0x01a2,0x01a2,0x01a3,0x01a2},{0x01a3,0x01a2,0x01a3,0x01a2},{0x01a4,0x01a4,0x01a5,0x01a4}, +{0x01a5,0x01a4,0x01a5,0x01a4},{0x01a6,0x01a6,0x0280,0x01a6},{0x01a7,0x01a7,0x01a8,0x01a7},{0x01a8,0x01a7,0x01a8,0x01a7}, +{0x01a9,0x01a9,0x0283,0x01a9},{0x01ac,0x01ac,0x01ad,0x01ac},{0x01ad,0x01ac,0x01ad,0x01ac},{0x01ae,0x01ae,0x0288,0x01ae}, +{0x01af,0x01af,0x01b0,0x01af},{0x01b0,0x01af,0x01b0,0x01af},{0x01b1,0x01b1,0x028a,0x01b1},{0x01b2,0x01b2,0x028b,0x01b2}, +{0x01b3,0x01b3,0x01b4,0x01b3},{0x01b4,0x01b3,0x01b4,0x01b3},{0x01b5,0x01b5,0x01b6,0x01b5},{0x01b6,0x01b5,0x01b6,0x01b5}, +{0x01b7,0x01b7,0x0292,0x01b7},{0x01b8,0x01b8,0x01b9,0x01b8},{0x01b9,0x01b8,0x01b9,0x01b8},{0x01bc,0x01bc,0x01bd,0x01bc}, +{0x01bd,0x01bc,0x01bd,0x01bc},{0x01bf,0x01f7,0x01bf,0x01f7},{0x01c4,0x01c4,0x01c6,0x01c5},{0x01c5,0x01c4,0x01c6,0x01c5}, +{0x01c6,0x01c4,0x01c6,0x01c5},{0x01c7,0x01c7,0x01c9,0x01c8},{0x01c8,0x01c7,0x01c9,0x01c8},{0x01c9,0x01c7,0x01c9,0x01c8}, +{0x01ca,0x01ca,0x01cc,0x01cb},{0x01cb,0x01ca,0x01cc,0x01cb},{0x01cc,0x01ca,0x01cc,0x01cb},{0x01cd,0x01cd,0x01ce,0x01cd}, +{0x01ce,0x01cd,0x01ce,0x01cd},{0x01cf,0x01cf,0x01d0,0x01cf},{0x01d0,0x01cf,0x01d0,0x01cf},{0x01d1,0x01d1,0x01d2,0x01d1}, +{0x01d2,0x01d1,0x01d2,0x01d1},{0x01d3,0x01d3,0x01d4,0x01d3},{0x01d4,0x01d3,0x01d4,0x01d3},{0x01d5,0x01d5,0x01d6,0x01d5}, +{0x01d6,0x01d5,0x01d6,0x01d5},{0x01d7,0x01d7,0x01d8,0x01d7},{0x01d8,0x01d7,0x01d8,0x01d7},{0x01d9,0x01d9,0x01da,0x01d9}, +{0x01da,0x01d9,0x01da,0x01d9},{0x01db,0x01db,0x01dc,0x01db},{0x01dc,0x01db,0x01dc,0x01db},{0x01dd,0x018e,0x01dd,0x018e}, +{0x01de,0x01de,0x01df,0x01de},{0x01df,0x01de,0x01df,0x01de},{0x01e0,0x01e0,0x01e1,0x01e0},{0x01e1,0x01e0,0x01e1,0x01e0}, +{0x01e2,0x01e2,0x01e3,0x01e2},{0x01e3,0x01e2,0x01e3,0x01e2},{0x01e4,0x01e4,0x01e5,0x01e4},{0x01e5,0x01e4,0x01e5,0x01e4}, +{0x01e6,0x01e6,0x01e7,0x01e6},{0x01e7,0x01e6,0x01e7,0x01e6},{0x01e8,0x01e8,0x01e9,0x01e8},{0x01e9,0x01e8,0x01e9,0x01e8}, +{0x01ea,0x01ea,0x01eb,0x01ea},{0x01eb,0x01ea,0x01eb,0x01ea},{0x01ec,0x01ec,0x01ed,0x01ec},{0x01ed,0x01ec,0x01ed,0x01ec}, +{0x01ee,0x01ee,0x01ef,0x01ee},{0x01ef,0x01ee,0x01ef,0x01ee},{0x01f1,0x01f1,0x01f3,0x01f2},{0x01f2,0x01f1,0x01f3,0x01f2}, +{0x01f3,0x01f1,0x01f3,0x01f2},{0x01f4,0x01f4,0x01f5,0x01f4},{0x01f5,0x01f4,0x01f5,0x01f4},{0x01f6,0x01f6,0x0195,0x01f6}, +{0x01f7,0x01f7,0x01bf,0x01f7},{0x01f8,0x01f8,0x01f9,0x01f8},{0x01f9,0x01f8,0x01f9,0x01f8},{0x01fa,0x01fa,0x01fb,0x01fa}, +{0x01fb,0x01fa,0x01fb,0x01fa},{0x01fc,0x01fc,0x01fd,0x01fc},{0x01fd,0x01fc,0x01fd,0x01fc},{0x01fe,0x01fe,0x01ff,0x01fe}, +{0x01ff,0x01fe,0x01ff,0x01fe},{0x0200,0x0200,0x0201,0x0200},{0x0201,0x0200,0x0201,0x0200},{0x0202,0x0202,0x0203,0x0202}, +{0x0203,0x0202,0x0203,0x0202},{0x0204,0x0204,0x0205,0x0204},{0x0205,0x0204,0x0205,0x0204},{0x0206,0x0206,0x0207,0x0206}, +{0x0207,0x0206,0x0207,0x0206},{0x0208,0x0208,0x0209,0x0208},{0x0209,0x0208,0x0209,0x0208},{0x020a,0x020a,0x020b,0x020a}, +{0x020b,0x020a,0x020b,0x020a},{0x020c,0x020c,0x020d,0x020c},{0x020d,0x020c,0x020d,0x020c},{0x020e,0x020e,0x020f,0x020e}, +{0x020f,0x020e,0x020f,0x020e},{0x0210,0x0210,0x0211,0x0210},{0x0211,0x0210,0x0211,0x0210},{0x0212,0x0212,0x0213,0x0212}, +{0x0213,0x0212,0x0213,0x0212},{0x0214,0x0214,0x0215,0x0214},{0x0215,0x0214,0x0215,0x0214},{0x0216,0x0216,0x0217,0x0216}, +{0x0217,0x0216,0x0217,0x0216},{0x0218,0x0218,0x0219,0x0218},{0x0219,0x0218,0x0219,0x0218},{0x021a,0x021a,0x021b,0x021a}, +{0x021b,0x021a,0x021b,0x021a},{0x021c,0x021c,0x021d,0x021c},{0x021d,0x021c,0x021d,0x021c},{0x021e,0x021e,0x021f,0x021e}, +{0x021f,0x021e,0x021f,0x021e},{0x0220,0x0220,0x019e,0x0220},{0x0222,0x0222,0x0223,0x0222},{0x0223,0x0222,0x0223,0x0222}, +{0x0224,0x0224,0x0225,0x0224},{0x0225,0x0224,0x0225,0x0224},{0x0226,0x0226,0x0227,0x0226},{0x0227,0x0226,0x0227,0x0226}, +{0x0228,0x0228,0x0229,0x0228},{0x0229,0x0228,0x0229,0x0228},{0x022a,0x022a,0x022b,0x022a},{0x022b,0x022a,0x022b,0x022a}, +{0x022c,0x022c,0x022d,0x022c},{0x022d,0x022c,0x022d,0x022c},{0x022e,0x022e,0x022f,0x022e},{0x022f,0x022e,0x022f,0x022e}, +{0x0230,0x0230,0x0231,0x0230},{0x0231,0x0230,0x0231,0x0230},{0x0232,0x0232,0x0233,0x0232},{0x0233,0x0232,0x0233,0x0232}, +{0x023a,0x023a,0x2c65,0x023a},{0x023b,0x023b,0x023c,0x023b},{0x023c,0x023b,0x023c,0x023b},{0x023d,0x023d,0x019a,0x023d}, +{0x023e,0x023e,0x2c66,0x023e},{0x023f,0x2c7e,0x023f,0x2c7e},{0x0240,0x2c7f,0x0240,0x2c7f},{0x0241,0x0241,0x0242,0x0241}, +{0x0242,0x0241,0x0242,0x0241},{0x0243,0x0243,0x0180,0x0243},{0x0244,0x0244,0x0289,0x0244},{0x0245,0x0245,0x028c,0x0245}, +{0x0246,0x0246,0x0247,0x0246},{0x0247,0x0246,0x0247,0x0246},{0x0248,0x0248,0x0249,0x0248},{0x0249,0x0248,0x0249,0x0248}, +{0x024a,0x024a,0x024b,0x024a},{0x024b,0x024a,0x024b,0x024a},{0x024c,0x024c,0x024d,0x024c},{0x024d,0x024c,0x024d,0x024c}, +{0x024e,0x024e,0x024f,0x024e},{0x024f,0x024e,0x024f,0x024e},{0x0250,0x2c6f,0x0250,0x2c6f},{0x0251,0x2c6d,0x0251,0x2c6d}, +{0x0252,0x2c70,0x0252,0x2c70},{0x0253,0x0181,0x0253,0x0181},{0x0254,0x0186,0x0254,0x0186},{0x0256,0x0189,0x0256,0x0189}, +{0x0257,0x018a,0x0257,0x018a},{0x0259,0x018f,0x0259,0x018f},{0x025b,0x0190,0x025b,0x0190},{0x0260,0x0193,0x0260,0x0193}, +{0x0263,0x0194,0x0263,0x0194},{0x0265,0xa78d,0x0265,0xa78d},{0x0268,0x0197,0x0268,0x0197},{0x0269,0x0196,0x0269,0x0196}, +{0x026b,0x2c62,0x026b,0x2c62},{0x026f,0x019c,0x026f,0x019c},{0x0271,0x2c6e,0x0271,0x2c6e},{0x0272,0x019d,0x0272,0x019d}, +{0x0275,0x019f,0x0275,0x019f},{0x027d,0x2c64,0x027d,0x2c64},{0x0280,0x01a6,0x0280,0x01a6},{0x0283,0x01a9,0x0283,0x01a9}, +{0x0288,0x01ae,0x0288,0x01ae},{0x0289,0x0244,0x0289,0x0244},{0x028a,0x01b1,0x028a,0x01b1},{0x028b,0x01b2,0x028b,0x01b2}, +{0x028c,0x0245,0x028c,0x0245},{0x0292,0x01b7,0x0292,0x01b7},{0x0345,0x0399,0x0345,0x0399},{0x0370,0x0370,0x0371,0x0370}, +{0x0371,0x0370,0x0371,0x0370},{0x0372,0x0372,0x0373,0x0372},{0x0373,0x0372,0x0373,0x0372},{0x0376,0x0376,0x0377,0x0376}, +{0x0377,0x0376,0x0377,0x0376},{0x037b,0x03fd,0x037b,0x03fd},{0x037c,0x03fe,0x037c,0x03fe},{0x037d,0x03ff,0x037d,0x03ff}, +{0x0386,0x0386,0x03ac,0x0386},{0x0388,0x0388,0x03ad,0x0388},{0x0389,0x0389,0x03ae,0x0389},{0x038a,0x038a,0x03af,0x038a}, +{0x038c,0x038c,0x03cc,0x038c},{0x038e,0x038e,0x03cd,0x038e},{0x038f,0x038f,0x03ce,0x038f},{0x0391,0x0391,0x03b1,0x0391}, +{0x0392,0x0392,0x03b2,0x0392},{0x0393,0x0393,0x03b3,0x0393},{0x0394,0x0394,0x03b4,0x0394},{0x0395,0x0395,0x03b5,0x0395}, +{0x0396,0x0396,0x03b6,0x0396},{0x0397,0x0397,0x03b7,0x0397},{0x0398,0x0398,0x03b8,0x0398},{0x0399,0x0399,0x03b9,0x0399}, +{0x039a,0x039a,0x03ba,0x039a},{0x039b,0x039b,0x03bb,0x039b},{0x039c,0x039c,0x03bc,0x039c},{0x039d,0x039d,0x03bd,0x039d}, +{0x039e,0x039e,0x03be,0x039e},{0x039f,0x039f,0x03bf,0x039f},{0x03a0,0x03a0,0x03c0,0x03a0},{0x03a1,0x03a1,0x03c1,0x03a1}, +{0x03a3,0x03a3,0x03c3,0x03a3},{0x03a4,0x03a4,0x03c4,0x03a4},{0x03a5,0x03a5,0x03c5,0x03a5},{0x03a6,0x03a6,0x03c6,0x03a6}, +{0x03a7,0x03a7,0x03c7,0x03a7},{0x03a8,0x03a8,0x03c8,0x03a8},{0x03a9,0x03a9,0x03c9,0x03a9},{0x03aa,0x03aa,0x03ca,0x03aa}, +{0x03ab,0x03ab,0x03cb,0x03ab},{0x03ac,0x0386,0x03ac,0x0386},{0x03ad,0x0388,0x03ad,0x0388},{0x03ae,0x0389,0x03ae,0x0389}, +{0x03af,0x038a,0x03af,0x038a},{0x03b1,0x0391,0x03b1,0x0391},{0x03b2,0x0392,0x03b2,0x0392},{0x03b3,0x0393,0x03b3,0x0393}, +{0x03b4,0x0394,0x03b4,0x0394},{0x03b5,0x0395,0x03b5,0x0395},{0x03b6,0x0396,0x03b6,0x0396},{0x03b7,0x0397,0x03b7,0x0397}, +{0x03b8,0x0398,0x03b8,0x0398},{0x03b9,0x0399,0x03b9,0x0399},{0x03ba,0x039a,0x03ba,0x039a},{0x03bb,0x039b,0x03bb,0x039b}, +{0x03bc,0x039c,0x03bc,0x039c},{0x03bd,0x039d,0x03bd,0x039d},{0x03be,0x039e,0x03be,0x039e},{0x03bf,0x039f,0x03bf,0x039f}, +{0x03c0,0x03a0,0x03c0,0x03a0},{0x03c1,0x03a1,0x03c1,0x03a1},{0x03c2,0x03a3,0x03c2,0x03a3},{0x03c3,0x03a3,0x03c3,0x03a3}, +{0x03c4,0x03a4,0x03c4,0x03a4},{0x03c5,0x03a5,0x03c5,0x03a5},{0x03c6,0x03a6,0x03c6,0x03a6},{0x03c7,0x03a7,0x03c7,0x03a7}, +{0x03c8,0x03a8,0x03c8,0x03a8},{0x03c9,0x03a9,0x03c9,0x03a9},{0x03ca,0x03aa,0x03ca,0x03aa},{0x03cb,0x03ab,0x03cb,0x03ab}, +{0x03cc,0x038c,0x03cc,0x038c},{0x03cd,0x038e,0x03cd,0x038e},{0x03ce,0x038f,0x03ce,0x038f},{0x03cf,0x03cf,0x03d7,0x03cf}, +{0x03d0,0x0392,0x03d0,0x0392},{0x03d1,0x0398,0x03d1,0x0398},{0x03d5,0x03a6,0x03d5,0x03a6},{0x03d6,0x03a0,0x03d6,0x03a0}, +{0x03d7,0x03cf,0x03d7,0x03cf},{0x03d8,0x03d8,0x03d9,0x03d8},{0x03d9,0x03d8,0x03d9,0x03d8},{0x03da,0x03da,0x03db,0x03da}, +{0x03db,0x03da,0x03db,0x03da},{0x03dc,0x03dc,0x03dd,0x03dc},{0x03dd,0x03dc,0x03dd,0x03dc},{0x03de,0x03de,0x03df,0x03de}, +{0x03df,0x03de,0x03df,0x03de},{0x03e0,0x03e0,0x03e1,0x03e0},{0x03e1,0x03e0,0x03e1,0x03e0},{0x03e2,0x03e2,0x03e3,0x03e2}, +{0x03e3,0x03e2,0x03e3,0x03e2},{0x03e4,0x03e4,0x03e5,0x03e4},{0x03e5,0x03e4,0x03e5,0x03e4},{0x03e6,0x03e6,0x03e7,0x03e6}, +{0x03e7,0x03e6,0x03e7,0x03e6},{0x03e8,0x03e8,0x03e9,0x03e8},{0x03e9,0x03e8,0x03e9,0x03e8},{0x03ea,0x03ea,0x03eb,0x03ea}, +{0x03eb,0x03ea,0x03eb,0x03ea},{0x03ec,0x03ec,0x03ed,0x03ec},{0x03ed,0x03ec,0x03ed,0x03ec},{0x03ee,0x03ee,0x03ef,0x03ee}, +{0x03ef,0x03ee,0x03ef,0x03ee},{0x03f0,0x039a,0x03f0,0x039a},{0x03f1,0x03a1,0x03f1,0x03a1},{0x03f2,0x03f9,0x03f2,0x03f9}, +{0x03f4,0x03f4,0x03b8,0x03f4},{0x03f5,0x0395,0x03f5,0x0395},{0x03f7,0x03f7,0x03f8,0x03f7},{0x03f8,0x03f7,0x03f8,0x03f7}, +{0x03f9,0x03f9,0x03f2,0x03f9},{0x03fa,0x03fa,0x03fb,0x03fa},{0x03fb,0x03fa,0x03fb,0x03fa},{0x03fd,0x03fd,0x037b,0x03fd}, +{0x03fe,0x03fe,0x037c,0x03fe},{0x03ff,0x03ff,0x037d,0x03ff},{0x0400,0x0400,0x0450,0x0400},{0x10400,0x10400,0x10428,0x10400}, +{0x2c00,0x2c00,0x2c30,0x2c00},{0x2c01,0x2c01,0x2c31,0x2c01},{0x10401,0x10401,0x10429,0x10401},{0x0401,0x0401,0x0451,0x0401}, +{0x2c02,0x2c02,0x2c32,0x2c02},{0x10402,0x10402,0x1042a,0x10402},{0x0402,0x0402,0x0452,0x0402},{0x10403,0x10403,0x1042b,0x10403}, +{0x0403,0x0403,0x0453,0x0403},{0x2c03,0x2c03,0x2c33,0x2c03},{0x0404,0x0404,0x0454,0x0404},{0x10404,0x10404,0x1042c,0x10404}, +{0x2c04,0x2c04,0x2c34,0x2c04},{0x0405,0x0405,0x0455,0x0405},{0x2c05,0x2c05,0x2c35,0x2c05},{0x10405,0x10405,0x1042d,0x10405}, +{0x10406,0x10406,0x1042e,0x10406},{0x0406,0x0406,0x0456,0x0406},{0x2c06,0x2c06,0x2c36,0x2c06},{0x0407,0x0407,0x0457,0x0407}, +{0x2c07,0x2c07,0x2c37,0x2c07},{0x10407,0x10407,0x1042f,0x10407},{0x2c08,0x2c08,0x2c38,0x2c08},{0x0408,0x0408,0x0458,0x0408}, +{0x10408,0x10408,0x10430,0x10408},{0x0409,0x0409,0x0459,0x0409},{0x2c09,0x2c09,0x2c39,0x2c09},{0x10409,0x10409,0x10431,0x10409}, +{0x1040a,0x1040a,0x10432,0x1040a},{0x2c0a,0x2c0a,0x2c3a,0x2c0a},{0x040a,0x040a,0x045a,0x040a},{0x1040b,0x1040b,0x10433,0x1040b}, +{0x040b,0x040b,0x045b,0x040b},{0x2c0b,0x2c0b,0x2c3b,0x2c0b},{0x2c0c,0x2c0c,0x2c3c,0x2c0c},{0x1040c,0x1040c,0x10434,0x1040c}, +{0x040c,0x040c,0x045c,0x040c},{0x2c0d,0x2c0d,0x2c3d,0x2c0d},{0x040d,0x040d,0x045d,0x040d},{0x1040d,0x1040d,0x10435,0x1040d}, +{0x1040e,0x1040e,0x10436,0x1040e},{0x040e,0x040e,0x045e,0x040e},{0x2c0e,0x2c0e,0x2c3e,0x2c0e},{0x2c0f,0x2c0f,0x2c3f,0x2c0f}, +{0x1040f,0x1040f,0x10437,0x1040f},{0x040f,0x040f,0x045f,0x040f},{0x2c10,0x2c10,0x2c40,0x2c10},{0x0410,0x0410,0x0430,0x0410}, +{0x10410,0x10410,0x10438,0x10410},{0x2c11,0x2c11,0x2c41,0x2c11},{0x10411,0x10411,0x10439,0x10411},{0x0411,0x0411,0x0431,0x0411}, +{0x10412,0x10412,0x1043a,0x10412},{0x2c12,0x2c12,0x2c42,0x2c12},{0x0412,0x0412,0x0432,0x0412},{0x10413,0x10413,0x1043b,0x10413}, +{0x2c13,0x2c13,0x2c43,0x2c13},{0x0413,0x0413,0x0433,0x0413},{0x2c14,0x2c14,0x2c44,0x2c14},{0x0414,0x0414,0x0434,0x0414}, +{0x10414,0x10414,0x1043c,0x10414},{0x2c15,0x2c15,0x2c45,0x2c15},{0x10415,0x10415,0x1043d,0x10415},{0x0415,0x0415,0x0435,0x0415}, +{0x10416,0x10416,0x1043e,0x10416},{0x0416,0x0416,0x0436,0x0416},{0x2c16,0x2c16,0x2c46,0x2c16},{0x0417,0x0417,0x0437,0x0417}, +{0x10417,0x10417,0x1043f,0x10417},{0x2c17,0x2c17,0x2c47,0x2c17},{0x0418,0x0418,0x0438,0x0418},{0x10418,0x10418,0x10440,0x10418}, +{0x2c18,0x2c18,0x2c48,0x2c18},{0x2c19,0x2c19,0x2c49,0x2c19},{0x10419,0x10419,0x10441,0x10419},{0x0419,0x0419,0x0439,0x0419}, +{0x1041a,0x1041a,0x10442,0x1041a},{0x041a,0x041a,0x043a,0x041a},{0x2c1a,0x2c1a,0x2c4a,0x2c1a},{0x2c1b,0x2c1b,0x2c4b,0x2c1b}, +{0x1041b,0x1041b,0x10443,0x1041b},{0x041b,0x041b,0x043b,0x041b},{0x041c,0x041c,0x043c,0x041c},{0x2c1c,0x2c1c,0x2c4c,0x2c1c}, +{0x1041c,0x1041c,0x10444,0x1041c},{0x1041d,0x1041d,0x10445,0x1041d},{0x041d,0x041d,0x043d,0x041d},{0x2c1d,0x2c1d,0x2c4d,0x2c1d}, +{0x1041e,0x1041e,0x10446,0x1041e},{0x041e,0x041e,0x043e,0x041e},{0x2c1e,0x2c1e,0x2c4e,0x2c1e},{0x2c1f,0x2c1f,0x2c4f,0x2c1f}, +{0x041f,0x041f,0x043f,0x041f},{0x1041f,0x1041f,0x10447,0x1041f},{0x0420,0x0420,0x0440,0x0420},{0x2c20,0x2c20,0x2c50,0x2c20}, +{0x10420,0x10420,0x10448,0x10420},{0x10421,0x10421,0x10449,0x10421},{0x0421,0x0421,0x0441,0x0421},{0x2c21,0x2c21,0x2c51,0x2c21}, +{0x10422,0x10422,0x1044a,0x10422},{0x2c22,0x2c22,0x2c52,0x2c22},{0x0422,0x0422,0x0442,0x0422},{0x0423,0x0423,0x0443,0x0423}, +{0x2c23,0x2c23,0x2c53,0x2c23},{0x10423,0x10423,0x1044b,0x10423},{0x0424,0x0424,0x0444,0x0424},{0x10424,0x10424,0x1044c,0x10424}, +{0x2c24,0x2c24,0x2c54,0x2c24},{0x10425,0x10425,0x1044d,0x10425},{0x2c25,0x2c25,0x2c55,0x2c25},{0x0425,0x0425,0x0445,0x0425}, +{0x2c26,0x2c26,0x2c56,0x2c26},{0x0426,0x0426,0x0446,0x0426},{0x10426,0x10426,0x1044e,0x10426},{0x0427,0x0427,0x0447,0x0427}, +{0x2c27,0x2c27,0x2c57,0x2c27},{0x10427,0x10427,0x1044f,0x10427},{0x0428,0x0428,0x0448,0x0428},{0x10428,0x10400,0x10428,0x10400}, +{0x2c28,0x2c28,0x2c58,0x2c28},{0x10429,0x10401,0x10429,0x10401},{0x2c29,0x2c29,0x2c59,0x2c29},{0x0429,0x0429,0x0449,0x0429}, +{0x042a,0x042a,0x044a,0x042a},{0x1042a,0x10402,0x1042a,0x10402},{0x2c2a,0x2c2a,0x2c5a,0x2c2a},{0x1042b,0x10403,0x1042b,0x10403}, +{0x2c2b,0x2c2b,0x2c5b,0x2c2b},{0x042b,0x042b,0x044b,0x042b},{0x042c,0x042c,0x044c,0x042c},{0x2c2c,0x2c2c,0x2c5c,0x2c2c}, +{0x1042c,0x10404,0x1042c,0x10404},{0x2c2d,0x2c2d,0x2c5d,0x2c2d},{0x042d,0x042d,0x044d,0x042d},{0x1042d,0x10405,0x1042d,0x10405}, +{0x1042e,0x10406,0x1042e,0x10406},{0x042e,0x042e,0x044e,0x042e},{0x2c2e,0x2c2e,0x2c5e,0x2c2e},{0x1042f,0x10407,0x1042f,0x10407}, +{0x042f,0x042f,0x044f,0x042f},{0x10430,0x10408,0x10430,0x10408},{0x2c30,0x2c00,0x2c30,0x2c00},{0x0430,0x0410,0x0430,0x0410}, +{0x2c31,0x2c01,0x2c31,0x2c01},{0x10431,0x10409,0x10431,0x10409},{0x0431,0x0411,0x0431,0x0411},{0x10432,0x1040a,0x10432,0x1040a}, +{0x0432,0x0412,0x0432,0x0412},{0x2c32,0x2c02,0x2c32,0x2c02},{0x2c33,0x2c03,0x2c33,0x2c03},{0x10433,0x1040b,0x10433,0x1040b}, +{0x0433,0x0413,0x0433,0x0413},{0x0434,0x0414,0x0434,0x0414},{0x2c34,0x2c04,0x2c34,0x2c04},{0x10434,0x1040c,0x10434,0x1040c}, +{0x10435,0x1040d,0x10435,0x1040d},{0x0435,0x0415,0x0435,0x0415},{0x2c35,0x2c05,0x2c35,0x2c05},{0x2c36,0x2c06,0x2c36,0x2c06}, +{0x0436,0x0416,0x0436,0x0416},{0x10436,0x1040e,0x10436,0x1040e},{0x2c37,0x2c07,0x2c37,0x2c07},{0x10437,0x1040f,0x10437,0x1040f}, +{0x0437,0x0417,0x0437,0x0417},{0x2c38,0x2c08,0x2c38,0x2c08},{0x10438,0x10410,0x10438,0x10410},{0x0438,0x0418,0x0438,0x0418}, +{0x2c39,0x2c09,0x2c39,0x2c09},{0x10439,0x10411,0x10439,0x10411},{0x0439,0x0419,0x0439,0x0419},{0x043a,0x041a,0x043a,0x041a}, +{0x1043a,0x10412,0x1043a,0x10412},{0x2c3a,0x2c0a,0x2c3a,0x2c0a},{0x043b,0x041b,0x043b,0x041b},{0x1043b,0x10413,0x1043b,0x10413}, +{0x2c3b,0x2c0b,0x2c3b,0x2c0b},{0x043c,0x041c,0x043c,0x041c},{0x1043c,0x10414,0x1043c,0x10414},{0x2c3c,0x2c0c,0x2c3c,0x2c0c}, +{0x2c3d,0x2c0d,0x2c3d,0x2c0d},{0x043d,0x041d,0x043d,0x041d},{0x1043d,0x10415,0x1043d,0x10415},{0x2c3e,0x2c0e,0x2c3e,0x2c0e}, +{0x043e,0x041e,0x043e,0x041e},{0x1043e,0x10416,0x1043e,0x10416},{0x2c3f,0x2c0f,0x2c3f,0x2c0f},{0x1043f,0x10417,0x1043f,0x10417}, +{0x043f,0x041f,0x043f,0x041f},{0x2c40,0x2c10,0x2c40,0x2c10},{0x0440,0x0420,0x0440,0x0420},{0x10440,0x10418,0x10440,0x10418}, +{0x0441,0x0421,0x0441,0x0421},{0x2c41,0x2c11,0x2c41,0x2c11},{0x10441,0x10419,0x10441,0x10419},{0x10442,0x1041a,0x10442,0x1041a}, +{0x0442,0x0422,0x0442,0x0422},{0x2c42,0x2c12,0x2c42,0x2c12},{0x10443,0x1041b,0x10443,0x1041b},{0x2c43,0x2c13,0x2c43,0x2c13}, +{0x0443,0x0423,0x0443,0x0423},{0x2c44,0x2c14,0x2c44,0x2c14},{0x0444,0x0424,0x0444,0x0424},{0x10444,0x1041c,0x10444,0x1041c}, +{0x2c45,0x2c15,0x2c45,0x2c15},{0x0445,0x0425,0x0445,0x0425},{0x10445,0x1041d,0x10445,0x1041d},{0x10446,0x1041e,0x10446,0x1041e}, +{0x0446,0x0426,0x0446,0x0426},{0x2c46,0x2c16,0x2c46,0x2c16},{0x2c47,0x2c17,0x2c47,0x2c17},{0x10447,0x1041f,0x10447,0x1041f}, +{0x0447,0x0427,0x0447,0x0427},{0x2c48,0x2c18,0x2c48,0x2c18},{0x0448,0x0428,0x0448,0x0428},{0x10448,0x10420,0x10448,0x10420}, +{0x10449,0x10421,0x10449,0x10421},{0x2c49,0x2c19,0x2c49,0x2c19},{0x0449,0x0429,0x0449,0x0429},{0x044a,0x042a,0x044a,0x042a}, +{0x2c4a,0x2c1a,0x2c4a,0x2c1a},{0x1044a,0x10422,0x1044a,0x10422},{0x2c4b,0x2c1b,0x2c4b,0x2c1b},{0x044b,0x042b,0x044b,0x042b}, +{0x1044b,0x10423,0x1044b,0x10423},{0x1044c,0x10424,0x1044c,0x10424},{0x2c4c,0x2c1c,0x2c4c,0x2c1c},{0x044c,0x042c,0x044c,0x042c}, +{0x1044d,0x10425,0x1044d,0x10425},{0x044d,0x042d,0x044d,0x042d},{0x2c4d,0x2c1d,0x2c4d,0x2c1d},{0x044e,0x042e,0x044e,0x042e}, +{0x1044e,0x10426,0x1044e,0x10426},{0x2c4e,0x2c1e,0x2c4e,0x2c1e},{0x2c4f,0x2c1f,0x2c4f,0x2c1f},{0x044f,0x042f,0x044f,0x042f}, +{0x1044f,0x10427,0x1044f,0x10427},{0x0450,0x0400,0x0450,0x0400},{0x2c50,0x2c20,0x2c50,0x2c20},{0x2c51,0x2c21,0x2c51,0x2c21}, +{0x0451,0x0401,0x0451,0x0401},{0x2c52,0x2c22,0x2c52,0x2c22},{0x0452,0x0402,0x0452,0x0402},{0x0453,0x0403,0x0453,0x0403}, +{0x2c53,0x2c23,0x2c53,0x2c23},{0x2c54,0x2c24,0x2c54,0x2c24},{0x0454,0x0404,0x0454,0x0404},{0x0455,0x0405,0x0455,0x0405}, +{0x2c55,0x2c25,0x2c55,0x2c25},{0x0456,0x0406,0x0456,0x0406},{0x2c56,0x2c26,0x2c56,0x2c26},{0x2c57,0x2c27,0x2c57,0x2c27}, +{0x0457,0x0407,0x0457,0x0407},{0x0458,0x0408,0x0458,0x0408},{0x2c58,0x2c28,0x2c58,0x2c28},{0x0459,0x0409,0x0459,0x0409}, +{0x2c59,0x2c29,0x2c59,0x2c29},{0x2c5a,0x2c2a,0x2c5a,0x2c2a},{0x045a,0x040a,0x045a,0x040a},{0x045b,0x040b,0x045b,0x040b}, +{0x2c5b,0x2c2b,0x2c5b,0x2c2b},{0x2c5c,0x2c2c,0x2c5c,0x2c2c},{0x045c,0x040c,0x045c,0x040c},{0x2c5d,0x2c2d,0x2c5d,0x2c2d}, +{0x045d,0x040d,0x045d,0x040d},{0x045e,0x040e,0x045e,0x040e},{0x2c5e,0x2c2e,0x2c5e,0x2c2e},{0x045f,0x040f,0x045f,0x040f}, +{0x2c60,0x2c60,0x2c61,0x2c60},{0x0460,0x0460,0x0461,0x0460},{0x0461,0x0460,0x0461,0x0460},{0x2c61,0x2c60,0x2c61,0x2c60}, +{0x2c62,0x2c62,0x026b,0x2c62},{0x0462,0x0462,0x0463,0x0462},{0x2c63,0x2c63,0x1d7d,0x2c63},{0x0463,0x0462,0x0463,0x0462}, +{0x2c64,0x2c64,0x027d,0x2c64},{0x0464,0x0464,0x0465,0x0464},{0x0465,0x0464,0x0465,0x0464},{0x2c65,0x023a,0x2c65,0x023a}, +{0x2c66,0x023e,0x2c66,0x023e},{0x0466,0x0466,0x0467,0x0466},{0x0467,0x0466,0x0467,0x0466},{0x2c67,0x2c67,0x2c68,0x2c67}, +{0x2c68,0x2c67,0x2c68,0x2c67},{0x0468,0x0468,0x0469,0x0468},{0x0469,0x0468,0x0469,0x0468},{0x2c69,0x2c69,0x2c6a,0x2c69}, +{0x2c6a,0x2c69,0x2c6a,0x2c69},{0x046a,0x046a,0x046b,0x046a},{0x046b,0x046a,0x046b,0x046a},{0x2c6b,0x2c6b,0x2c6c,0x2c6b}, +{0x046c,0x046c,0x046d,0x046c},{0x2c6c,0x2c6b,0x2c6c,0x2c6b},{0x046d,0x046c,0x046d,0x046c},{0x2c6d,0x2c6d,0x0251,0x2c6d}, +{0x2c6e,0x2c6e,0x0271,0x2c6e},{0x046e,0x046e,0x046f,0x046e},{0x046f,0x046e,0x046f,0x046e},{0x2c6f,0x2c6f,0x0250,0x2c6f}, +{0x0470,0x0470,0x0471,0x0470},{0x2c70,0x2c70,0x0252,0x2c70},{0x0471,0x0470,0x0471,0x0470},{0x2c72,0x2c72,0x2c73,0x2c72}, +{0x0472,0x0472,0x0473,0x0472},{0x2c73,0x2c72,0x2c73,0x2c72},{0x0473,0x0472,0x0473,0x0472},{0x0474,0x0474,0x0475,0x0474}, +{0x0475,0x0474,0x0475,0x0474},{0x2c75,0x2c75,0x2c76,0x2c75},{0x0476,0x0476,0x0477,0x0476},{0x2c76,0x2c75,0x2c76,0x2c75}, +{0x0477,0x0476,0x0477,0x0476},{0x0478,0x0478,0x0479,0x0478},{0x0479,0x0478,0x0479,0x0478},{0x047a,0x047a,0x047b,0x047a}, +{0x047b,0x047a,0x047b,0x047a},{0x047c,0x047c,0x047d,0x047c},{0x047d,0x047c,0x047d,0x047c},{0x047e,0x047e,0x047f,0x047e}, +{0x2c7e,0x2c7e,0x023f,0x2c7e},{0x2c7f,0x2c7f,0x0240,0x2c7f},{0x047f,0x047e,0x047f,0x047e},{0x2c80,0x2c80,0x2c81,0x2c80}, +{0x0480,0x0480,0x0481,0x0480},{0x2c81,0x2c80,0x2c81,0x2c80},{0x0481,0x0480,0x0481,0x0480},{0x2c82,0x2c82,0x2c83,0x2c82}, +{0x2c83,0x2c82,0x2c83,0x2c82},{0x2c84,0x2c84,0x2c85,0x2c84},{0x2c85,0x2c84,0x2c85,0x2c84},{0x2c86,0x2c86,0x2c87,0x2c86}, +{0x2c87,0x2c86,0x2c87,0x2c86},{0x2c88,0x2c88,0x2c89,0x2c88},{0x2c89,0x2c88,0x2c89,0x2c88},{0x048a,0x048a,0x048b,0x048a}, +{0x2c8a,0x2c8a,0x2c8b,0x2c8a},{0x2c8b,0x2c8a,0x2c8b,0x2c8a},{0x048b,0x048a,0x048b,0x048a},{0x2c8c,0x2c8c,0x2c8d,0x2c8c}, +{0x048c,0x048c,0x048d,0x048c},{0x048d,0x048c,0x048d,0x048c},{0x2c8d,0x2c8c,0x2c8d,0x2c8c},{0x2c8e,0x2c8e,0x2c8f,0x2c8e}, +{0x048e,0x048e,0x048f,0x048e},{0x2c8f,0x2c8e,0x2c8f,0x2c8e},{0x048f,0x048e,0x048f,0x048e},{0x0490,0x0490,0x0491,0x0490}, +{0x2c90,0x2c90,0x2c91,0x2c90},{0x2c91,0x2c90,0x2c91,0x2c90},{0x0491,0x0490,0x0491,0x0490},{0x0492,0x0492,0x0493,0x0492}, +{0x2c92,0x2c92,0x2c93,0x2c92},{0x2c93,0x2c92,0x2c93,0x2c92},{0x0493,0x0492,0x0493,0x0492},{0x2c94,0x2c94,0x2c95,0x2c94}, +{0x0494,0x0494,0x0495,0x0494},{0x0495,0x0494,0x0495,0x0494},{0x2c95,0x2c94,0x2c95,0x2c94},{0x2c96,0x2c96,0x2c97,0x2c96}, +{0x0496,0x0496,0x0497,0x0496},{0x2c97,0x2c96,0x2c97,0x2c96},{0x0497,0x0496,0x0497,0x0496},{0x0498,0x0498,0x0499,0x0498}, +{0x2c98,0x2c98,0x2c99,0x2c98},{0x2c99,0x2c98,0x2c99,0x2c98},{0x0499,0x0498,0x0499,0x0498},{0x049a,0x049a,0x049b,0x049a}, +{0x2c9a,0x2c9a,0x2c9b,0x2c9a},{0x049b,0x049a,0x049b,0x049a},{0x2c9b,0x2c9a,0x2c9b,0x2c9a},{0x049c,0x049c,0x049d,0x049c}, +{0x2c9c,0x2c9c,0x2c9d,0x2c9c},{0x049d,0x049c,0x049d,0x049c},{0x2c9d,0x2c9c,0x2c9d,0x2c9c},{0x049e,0x049e,0x049f,0x049e}, +{0x2c9e,0x2c9e,0x2c9f,0x2c9e},{0x2c9f,0x2c9e,0x2c9f,0x2c9e},{0x049f,0x049e,0x049f,0x049e},{0x04a0,0x04a0,0x04a1,0x04a0}, +{0x2ca0,0x2ca0,0x2ca1,0x2ca0},{0x04a1,0x04a0,0x04a1,0x04a0},{0x2ca1,0x2ca0,0x2ca1,0x2ca0},{0x04a2,0x04a2,0x04a3,0x04a2}, +{0x2ca2,0x2ca2,0x2ca3,0x2ca2},{0x2ca3,0x2ca2,0x2ca3,0x2ca2},{0x04a3,0x04a2,0x04a3,0x04a2},{0x2ca4,0x2ca4,0x2ca5,0x2ca4}, +{0x04a4,0x04a4,0x04a5,0x04a4},{0x04a5,0x04a4,0x04a5,0x04a4},{0x2ca5,0x2ca4,0x2ca5,0x2ca4},{0x04a6,0x04a6,0x04a7,0x04a6}, +{0x2ca6,0x2ca6,0x2ca7,0x2ca6},{0x2ca7,0x2ca6,0x2ca7,0x2ca6},{0x04a7,0x04a6,0x04a7,0x04a6},{0x2ca8,0x2ca8,0x2ca9,0x2ca8}, +{0x04a8,0x04a8,0x04a9,0x04a8},{0x04a9,0x04a8,0x04a9,0x04a8},{0x2ca9,0x2ca8,0x2ca9,0x2ca8},{0x04aa,0x04aa,0x04ab,0x04aa}, +{0x2caa,0x2caa,0x2cab,0x2caa},{0x04ab,0x04aa,0x04ab,0x04aa},{0x2cab,0x2caa,0x2cab,0x2caa},{0x2cac,0x2cac,0x2cad,0x2cac}, +{0x04ac,0x04ac,0x04ad,0x04ac},{0x04ad,0x04ac,0x04ad,0x04ac},{0x2cad,0x2cac,0x2cad,0x2cac},{0x04ae,0x04ae,0x04af,0x04ae}, +{0x2cae,0x2cae,0x2caf,0x2cae},{0x2caf,0x2cae,0x2caf,0x2cae},{0x04af,0x04ae,0x04af,0x04ae},{0x04b0,0x04b0,0x04b1,0x04b0}, +{0x2cb0,0x2cb0,0x2cb1,0x2cb0},{0x04b1,0x04b0,0x04b1,0x04b0},{0x2cb1,0x2cb0,0x2cb1,0x2cb0},{0x04b2,0x04b2,0x04b3,0x04b2}, +{0x2cb2,0x2cb2,0x2cb3,0x2cb2},{0x04b3,0x04b2,0x04b3,0x04b2},{0x2cb3,0x2cb2,0x2cb3,0x2cb2},{0x2cb4,0x2cb4,0x2cb5,0x2cb4}, +{0x04b4,0x04b4,0x04b5,0x04b4},{0x2cb5,0x2cb4,0x2cb5,0x2cb4},{0x04b5,0x04b4,0x04b5,0x04b4},{0x04b6,0x04b6,0x04b7,0x04b6}, +{0x2cb6,0x2cb6,0x2cb7,0x2cb6},{0x24b6,0x24b6,0x24d0,0x24b6},{0x24b7,0x24b7,0x24d1,0x24b7},{0x04b7,0x04b6,0x04b7,0x04b6}, +{0x2cb7,0x2cb6,0x2cb7,0x2cb6},{0x04b8,0x04b8,0x04b9,0x04b8},{0x24b8,0x24b8,0x24d2,0x24b8},{0x2cb8,0x2cb8,0x2cb9,0x2cb8}, +{0x24b9,0x24b9,0x24d3,0x24b9},{0x04b9,0x04b8,0x04b9,0x04b8},{0x2cb9,0x2cb8,0x2cb9,0x2cb8},{0x2cba,0x2cba,0x2cbb,0x2cba}, +{0x04ba,0x04ba,0x04bb,0x04ba},{0x24ba,0x24ba,0x24d4,0x24ba},{0x2cbb,0x2cba,0x2cbb,0x2cba},{0x24bb,0x24bb,0x24d5,0x24bb}, +{0x04bb,0x04ba,0x04bb,0x04ba},{0x2cbc,0x2cbc,0x2cbd,0x2cbc},{0x04bc,0x04bc,0x04bd,0x04bc},{0x24bc,0x24bc,0x24d6,0x24bc}, +{0x04bd,0x04bc,0x04bd,0x04bc},{0x2cbd,0x2cbc,0x2cbd,0x2cbc},{0x24bd,0x24bd,0x24d7,0x24bd},{0x24be,0x24be,0x24d8,0x24be}, +{0x04be,0x04be,0x04bf,0x04be},{0x2cbe,0x2cbe,0x2cbf,0x2cbe},{0x2cbf,0x2cbe,0x2cbf,0x2cbe},{0x24bf,0x24bf,0x24d9,0x24bf}, +{0x04bf,0x04be,0x04bf,0x04be},{0x04c0,0x04c0,0x04cf,0x04c0},{0x2cc0,0x2cc0,0x2cc1,0x2cc0},{0x24c0,0x24c0,0x24da,0x24c0}, +{0x04c1,0x04c1,0x04c2,0x04c1},{0x2cc1,0x2cc0,0x2cc1,0x2cc0},{0x24c1,0x24c1,0x24db,0x24c1},{0x2cc2,0x2cc2,0x2cc3,0x2cc2}, +{0x04c2,0x04c1,0x04c2,0x04c1},{0x24c2,0x24c2,0x24dc,0x24c2},{0x24c3,0x24c3,0x24dd,0x24c3},{0x2cc3,0x2cc2,0x2cc3,0x2cc2}, +{0x04c3,0x04c3,0x04c4,0x04c3},{0x2cc4,0x2cc4,0x2cc5,0x2cc4},{0x04c4,0x04c3,0x04c4,0x04c3},{0x24c4,0x24c4,0x24de,0x24c4}, +{0x2cc5,0x2cc4,0x2cc5,0x2cc4},{0x24c5,0x24c5,0x24df,0x24c5},{0x04c5,0x04c5,0x04c6,0x04c5},{0x04c6,0x04c5,0x04c6,0x04c5}, +{0x2cc6,0x2cc6,0x2cc7,0x2cc6},{0x24c6,0x24c6,0x24e0,0x24c6},{0x2cc7,0x2cc6,0x2cc7,0x2cc6},{0x04c7,0x04c7,0x04c8,0x04c7}, +{0x24c7,0x24c7,0x24e1,0x24c7},{0x24c8,0x24c8,0x24e2,0x24c8},{0x2cc8,0x2cc8,0x2cc9,0x2cc8},{0x04c8,0x04c7,0x04c8,0x04c7}, +{0x04c9,0x04c9,0x04ca,0x04c9},{0x2cc9,0x2cc8,0x2cc9,0x2cc8},{0x24c9,0x24c9,0x24e3,0x24c9},{0x24ca,0x24ca,0x24e4,0x24ca}, +{0x04ca,0x04c9,0x04ca,0x04c9},{0x2cca,0x2cca,0x2ccb,0x2cca},{0x24cb,0x24cb,0x24e5,0x24cb},{0x2ccb,0x2cca,0x2ccb,0x2cca}, +{0x04cb,0x04cb,0x04cc,0x04cb},{0x2ccc,0x2ccc,0x2ccd,0x2ccc},{0x24cc,0x24cc,0x24e6,0x24cc},{0x04cc,0x04cb,0x04cc,0x04cb}, +{0x04cd,0x04cd,0x04ce,0x04cd},{0x24cd,0x24cd,0x24e7,0x24cd},{0x2ccd,0x2ccc,0x2ccd,0x2ccc},{0x04ce,0x04cd,0x04ce,0x04cd}, +{0x2cce,0x2cce,0x2ccf,0x2cce},{0x24ce,0x24ce,0x24e8,0x24ce},{0x24cf,0x24cf,0x24e9,0x24cf},{0x2ccf,0x2cce,0x2ccf,0x2cce}, +{0x04cf,0x04c0,0x04cf,0x04c0},{0x24d0,0x24b6,0x24d0,0x24b6},{0x2cd0,0x2cd0,0x2cd1,0x2cd0},{0x04d0,0x04d0,0x04d1,0x04d0}, +{0x04d1,0x04d0,0x04d1,0x04d0},{0x2cd1,0x2cd0,0x2cd1,0x2cd0},{0x24d1,0x24b7,0x24d1,0x24b7},{0x04d2,0x04d2,0x04d3,0x04d2}, +{0x2cd2,0x2cd2,0x2cd3,0x2cd2},{0x24d2,0x24b8,0x24d2,0x24b8},{0x2cd3,0x2cd2,0x2cd3,0x2cd2},{0x24d3,0x24b9,0x24d3,0x24b9}, +{0x04d3,0x04d2,0x04d3,0x04d2},{0x2cd4,0x2cd4,0x2cd5,0x2cd4},{0x24d4,0x24ba,0x24d4,0x24ba},{0x04d4,0x04d4,0x04d5,0x04d4}, +{0x24d5,0x24bb,0x24d5,0x24bb},{0x2cd5,0x2cd4,0x2cd5,0x2cd4},{0x04d5,0x04d4,0x04d5,0x04d4},{0x2cd6,0x2cd6,0x2cd7,0x2cd6}, +{0x04d6,0x04d6,0x04d7,0x04d6},{0x24d6,0x24bc,0x24d6,0x24bc},{0x24d7,0x24bd,0x24d7,0x24bd},{0x2cd7,0x2cd6,0x2cd7,0x2cd6}, +{0x04d7,0x04d6,0x04d7,0x04d6},{0x04d8,0x04d8,0x04d9,0x04d8},{0x2cd8,0x2cd8,0x2cd9,0x2cd8},{0x24d8,0x24be,0x24d8,0x24be}, +{0x04d9,0x04d8,0x04d9,0x04d8},{0x2cd9,0x2cd8,0x2cd9,0x2cd8},{0x24d9,0x24bf,0x24d9,0x24bf},{0x24da,0x24c0,0x24da,0x24c0}, +{0x2cda,0x2cda,0x2cdb,0x2cda},{0x04da,0x04da,0x04db,0x04da},{0x04db,0x04da,0x04db,0x04da},{0x2cdb,0x2cda,0x2cdb,0x2cda}, +{0x24db,0x24c1,0x24db,0x24c1},{0x04dc,0x04dc,0x04dd,0x04dc},{0x24dc,0x24c2,0x24dc,0x24c2},{0x2cdc,0x2cdc,0x2cdd,0x2cdc}, +{0x2cdd,0x2cdc,0x2cdd,0x2cdc},{0x24dd,0x24c3,0x24dd,0x24c3},{0x04dd,0x04dc,0x04dd,0x04dc},{0x24de,0x24c4,0x24de,0x24c4}, +{0x2cde,0x2cde,0x2cdf,0x2cde},{0x04de,0x04de,0x04df,0x04de},{0x04df,0x04de,0x04df,0x04de},{0x24df,0x24c5,0x24df,0x24c5}, +{0x2cdf,0x2cde,0x2cdf,0x2cde},{0x24e0,0x24c6,0x24e0,0x24c6},{0x2ce0,0x2ce0,0x2ce1,0x2ce0},{0x04e0,0x04e0,0x04e1,0x04e0}, +{0x2ce1,0x2ce0,0x2ce1,0x2ce0},{0x04e1,0x04e0,0x04e1,0x04e0},{0x24e1,0x24c7,0x24e1,0x24c7},{0x04e2,0x04e2,0x04e3,0x04e2}, +{0x2ce2,0x2ce2,0x2ce3,0x2ce2},{0x24e2,0x24c8,0x24e2,0x24c8},{0x24e3,0x24c9,0x24e3,0x24c9},{0x2ce3,0x2ce2,0x2ce3,0x2ce2}, +{0x04e3,0x04e2,0x04e3,0x04e2},{0x24e4,0x24ca,0x24e4,0x24ca},{0x04e4,0x04e4,0x04e5,0x04e4},{0x24e5,0x24cb,0x24e5,0x24cb}, +{0x04e5,0x04e4,0x04e5,0x04e4},{0x04e6,0x04e6,0x04e7,0x04e6},{0x24e6,0x24cc,0x24e6,0x24cc},{0x24e7,0x24cd,0x24e7,0x24cd}, +{0x04e7,0x04e6,0x04e7,0x04e6},{0x04e8,0x04e8,0x04e9,0x04e8},{0x24e8,0x24ce,0x24e8,0x24ce},{0x04e9,0x04e8,0x04e9,0x04e8}, +{0x24e9,0x24cf,0x24e9,0x24cf},{0x04ea,0x04ea,0x04eb,0x04ea},{0x04eb,0x04ea,0x04eb,0x04ea},{0x2ceb,0x2ceb,0x2cec,0x2ceb}, +{0x2cec,0x2ceb,0x2cec,0x2ceb},{0x04ec,0x04ec,0x04ed,0x04ec},{0x2ced,0x2ced,0x2cee,0x2ced},{0x04ed,0x04ec,0x04ed,0x04ec}, +{0x04ee,0x04ee,0x04ef,0x04ee},{0x2cee,0x2ced,0x2cee,0x2ced},{0x04ef,0x04ee,0x04ef,0x04ee},{0x04f0,0x04f0,0x04f1,0x04f0}, +{0x04f1,0x04f0,0x04f1,0x04f0},{0x04f2,0x04f2,0x04f3,0x04f2},{0x04f3,0x04f2,0x04f3,0x04f2},{0x04f4,0x04f4,0x04f5,0x04f4}, +{0x04f5,0x04f4,0x04f5,0x04f4},{0x04f6,0x04f6,0x04f7,0x04f6},{0x04f7,0x04f6,0x04f7,0x04f6},{0x04f8,0x04f8,0x04f9,0x04f8}, +{0x04f9,0x04f8,0x04f9,0x04f8},{0x04fa,0x04fa,0x04fb,0x04fa},{0x04fb,0x04fa,0x04fb,0x04fa},{0x04fc,0x04fc,0x04fd,0x04fc}, +{0x04fd,0x04fc,0x04fd,0x04fc},{0x04fe,0x04fe,0x04ff,0x04fe},{0x04ff,0x04fe,0x04ff,0x04fe},{0x2d00,0x10a0,0x2d00,0x10a0}, +{0x0500,0x0500,0x0501,0x0500},{0x2d01,0x10a1,0x2d01,0x10a1},{0x0501,0x0500,0x0501,0x0500},{0x0502,0x0502,0x0503,0x0502}, +{0x2d02,0x10a2,0x2d02,0x10a2},{0x0503,0x0502,0x0503,0x0502},{0x2d03,0x10a3,0x2d03,0x10a3},{0x2d04,0x10a4,0x2d04,0x10a4}, +{0x0504,0x0504,0x0505,0x0504},{0x0505,0x0504,0x0505,0x0504},{0x2d05,0x10a5,0x2d05,0x10a5},{0x0506,0x0506,0x0507,0x0506}, +{0x2d06,0x10a6,0x2d06,0x10a6},{0x2d07,0x10a7,0x2d07,0x10a7},{0x0507,0x0506,0x0507,0x0506},{0x0508,0x0508,0x0509,0x0508}, +{0x2d08,0x10a8,0x2d08,0x10a8},{0x0509,0x0508,0x0509,0x0508},{0x2d09,0x10a9,0x2d09,0x10a9},{0x2d0a,0x10aa,0x2d0a,0x10aa}, +{0x050a,0x050a,0x050b,0x050a},{0x2d0b,0x10ab,0x2d0b,0x10ab},{0x050b,0x050a,0x050b,0x050a},{0x050c,0x050c,0x050d,0x050c}, +{0x2d0c,0x10ac,0x2d0c,0x10ac},{0x050d,0x050c,0x050d,0x050c},{0x2d0d,0x10ad,0x2d0d,0x10ad},{0x050e,0x050e,0x050f,0x050e}, +{0x2d0e,0x10ae,0x2d0e,0x10ae},{0x2d0f,0x10af,0x2d0f,0x10af},{0x050f,0x050e,0x050f,0x050e},{0x0510,0x0510,0x0511,0x0510}, +{0x2d10,0x10b0,0x2d10,0x10b0},{0x2d11,0x10b1,0x2d11,0x10b1},{0x0511,0x0510,0x0511,0x0510},{0x2d12,0x10b2,0x2d12,0x10b2}, +{0x0512,0x0512,0x0513,0x0512},{0x2d13,0x10b3,0x2d13,0x10b3},{0x0513,0x0512,0x0513,0x0512},{0x2d14,0x10b4,0x2d14,0x10b4}, +{0x0514,0x0514,0x0515,0x0514},{0x0515,0x0514,0x0515,0x0514},{0x2d15,0x10b5,0x2d15,0x10b5},{0x2d16,0x10b6,0x2d16,0x10b6}, +{0x0516,0x0516,0x0517,0x0516},{0x0517,0x0516,0x0517,0x0516},{0x2d17,0x10b7,0x2d17,0x10b7},{0x0518,0x0518,0x0519,0x0518}, +{0x2d18,0x10b8,0x2d18,0x10b8},{0x0519,0x0518,0x0519,0x0518},{0x2d19,0x10b9,0x2d19,0x10b9},{0x2d1a,0x10ba,0x2d1a,0x10ba}, +{0x051a,0x051a,0x051b,0x051a},{0x2d1b,0x10bb,0x2d1b,0x10bb},{0x051b,0x051a,0x051b,0x051a},{0x2d1c,0x10bc,0x2d1c,0x10bc}, +{0x051c,0x051c,0x051d,0x051c},{0x2d1d,0x10bd,0x2d1d,0x10bd},{0x051d,0x051c,0x051d,0x051c},{0x051e,0x051e,0x051f,0x051e}, +{0x2d1e,0x10be,0x2d1e,0x10be},{0x2d1f,0x10bf,0x2d1f,0x10bf},{0x051f,0x051e,0x051f,0x051e},{0x2d20,0x10c0,0x2d20,0x10c0}, +{0x0520,0x0520,0x0521,0x0520},{0x0521,0x0520,0x0521,0x0520},{0x2d21,0x10c1,0x2d21,0x10c1},{0x2d22,0x10c2,0x2d22,0x10c2}, +{0x0522,0x0522,0x0523,0x0522},{0x2d23,0x10c3,0x2d23,0x10c3},{0x0523,0x0522,0x0523,0x0522},{0x0524,0x0524,0x0525,0x0524}, +{0x2d24,0x10c4,0x2d24,0x10c4},{0x0525,0x0524,0x0525,0x0524},{0x2d25,0x10c5,0x2d25,0x10c5},{0x0526,0x0526,0x0527,0x0526}, +{0x0527,0x0526,0x0527,0x0526},{0x0531,0x0531,0x0561,0x0531},{0x0532,0x0532,0x0562,0x0532},{0x0533,0x0533,0x0563,0x0533}, +{0x0534,0x0534,0x0564,0x0534},{0x0535,0x0535,0x0565,0x0535},{0x0536,0x0536,0x0566,0x0536},{0x0537,0x0537,0x0567,0x0537}, +{0x0538,0x0538,0x0568,0x0538},{0x0539,0x0539,0x0569,0x0539},{0x053a,0x053a,0x056a,0x053a},{0x053b,0x053b,0x056b,0x053b}, +{0x053c,0x053c,0x056c,0x053c},{0x053d,0x053d,0x056d,0x053d},{0x053e,0x053e,0x056e,0x053e},{0x053f,0x053f,0x056f,0x053f}, +{0x0540,0x0540,0x0570,0x0540},{0x0541,0x0541,0x0571,0x0541},{0x0542,0x0542,0x0572,0x0542},{0x0543,0x0543,0x0573,0x0543}, +{0x0544,0x0544,0x0574,0x0544},{0x0545,0x0545,0x0575,0x0545},{0x0546,0x0546,0x0576,0x0546},{0x0547,0x0547,0x0577,0x0547}, +{0x0548,0x0548,0x0578,0x0548},{0x0549,0x0549,0x0579,0x0549},{0x054a,0x054a,0x057a,0x054a},{0x054b,0x054b,0x057b,0x054b}, +{0x054c,0x054c,0x057c,0x054c},{0x054d,0x054d,0x057d,0x054d},{0x054e,0x054e,0x057e,0x054e},{0x054f,0x054f,0x057f,0x054f}, +{0x0550,0x0550,0x0580,0x0550},{0x0551,0x0551,0x0581,0x0551},{0x0552,0x0552,0x0582,0x0552},{0x0553,0x0553,0x0583,0x0553}, +{0x0554,0x0554,0x0584,0x0554},{0x0555,0x0555,0x0585,0x0555},{0x0556,0x0556,0x0586,0x0556},{0x0561,0x0531,0x0561,0x0531}, +{0x0562,0x0532,0x0562,0x0532},{0x0563,0x0533,0x0563,0x0533},{0x0564,0x0534,0x0564,0x0534},{0x0565,0x0535,0x0565,0x0535}, +{0x0566,0x0536,0x0566,0x0536},{0x0567,0x0537,0x0567,0x0537},{0x0568,0x0538,0x0568,0x0538},{0x0569,0x0539,0x0569,0x0539}, +{0x056a,0x053a,0x056a,0x053a},{0x056b,0x053b,0x056b,0x053b},{0x056c,0x053c,0x056c,0x053c},{0x056d,0x053d,0x056d,0x053d}, +{0x056e,0x053e,0x056e,0x053e},{0x056f,0x053f,0x056f,0x053f},{0x0570,0x0540,0x0570,0x0540},{0x0571,0x0541,0x0571,0x0541}, +{0x0572,0x0542,0x0572,0x0542},{0x0573,0x0543,0x0573,0x0543},{0x0574,0x0544,0x0574,0x0544},{0x0575,0x0545,0x0575,0x0545}, +{0x0576,0x0546,0x0576,0x0546},{0x0577,0x0547,0x0577,0x0547},{0x0578,0x0548,0x0578,0x0548},{0x0579,0x0549,0x0579,0x0549}, +{0x1d79,0xa77d,0x1d79,0xa77d},{0x057a,0x054a,0x057a,0x054a},{0x057b,0x054b,0x057b,0x054b},{0x057c,0x054c,0x057c,0x054c}, +{0x1d7d,0x2c63,0x1d7d,0x2c63},{0x057d,0x054d,0x057d,0x054d},{0x057e,0x054e,0x057e,0x054e},{0x057f,0x054f,0x057f,0x054f}, +{0x0580,0x0550,0x0580,0x0550},{0x0581,0x0551,0x0581,0x0551},{0x0582,0x0552,0x0582,0x0552},{0x0583,0x0553,0x0583,0x0553}, +{0x0584,0x0554,0x0584,0x0554},{0x0585,0x0555,0x0585,0x0555},{0x0586,0x0556,0x0586,0x0556},{0x1e00,0x1e00,0x1e01,0x1e00}, +{0x1e01,0x1e00,0x1e01,0x1e00},{0x1e02,0x1e02,0x1e03,0x1e02},{0x1e03,0x1e02,0x1e03,0x1e02},{0x1e04,0x1e04,0x1e05,0x1e04}, +{0x1e05,0x1e04,0x1e05,0x1e04},{0x1e06,0x1e06,0x1e07,0x1e06},{0x1e07,0x1e06,0x1e07,0x1e06},{0x1e08,0x1e08,0x1e09,0x1e08}, +{0x1e09,0x1e08,0x1e09,0x1e08},{0x1e0a,0x1e0a,0x1e0b,0x1e0a},{0x1e0b,0x1e0a,0x1e0b,0x1e0a},{0x1e0c,0x1e0c,0x1e0d,0x1e0c}, +{0x1e0d,0x1e0c,0x1e0d,0x1e0c},{0x1e0e,0x1e0e,0x1e0f,0x1e0e},{0x1e0f,0x1e0e,0x1e0f,0x1e0e},{0x1e10,0x1e10,0x1e11,0x1e10}, +{0x1e11,0x1e10,0x1e11,0x1e10},{0x1e12,0x1e12,0x1e13,0x1e12},{0x1e13,0x1e12,0x1e13,0x1e12},{0x1e14,0x1e14,0x1e15,0x1e14}, +{0x1e15,0x1e14,0x1e15,0x1e14},{0x1e16,0x1e16,0x1e17,0x1e16},{0x1e17,0x1e16,0x1e17,0x1e16},{0x1e18,0x1e18,0x1e19,0x1e18}, +{0x1e19,0x1e18,0x1e19,0x1e18},{0x1e1a,0x1e1a,0x1e1b,0x1e1a},{0x1e1b,0x1e1a,0x1e1b,0x1e1a},{0x1e1c,0x1e1c,0x1e1d,0x1e1c}, +{0x1e1d,0x1e1c,0x1e1d,0x1e1c},{0x1e1e,0x1e1e,0x1e1f,0x1e1e},{0x1e1f,0x1e1e,0x1e1f,0x1e1e},{0x1e20,0x1e20,0x1e21,0x1e20}, +{0x1e21,0x1e20,0x1e21,0x1e20},{0x1e22,0x1e22,0x1e23,0x1e22},{0x1e23,0x1e22,0x1e23,0x1e22},{0x1e24,0x1e24,0x1e25,0x1e24}, +{0x1e25,0x1e24,0x1e25,0x1e24},{0x1e26,0x1e26,0x1e27,0x1e26},{0x1e27,0x1e26,0x1e27,0x1e26},{0x1e28,0x1e28,0x1e29,0x1e28}, +{0x1e29,0x1e28,0x1e29,0x1e28},{0x1e2a,0x1e2a,0x1e2b,0x1e2a},{0x1e2b,0x1e2a,0x1e2b,0x1e2a},{0x1e2c,0x1e2c,0x1e2d,0x1e2c}, +{0x1e2d,0x1e2c,0x1e2d,0x1e2c},{0x1e2e,0x1e2e,0x1e2f,0x1e2e},{0x1e2f,0x1e2e,0x1e2f,0x1e2e},{0x1e30,0x1e30,0x1e31,0x1e30}, +{0x1e31,0x1e30,0x1e31,0x1e30},{0x1e32,0x1e32,0x1e33,0x1e32},{0x1e33,0x1e32,0x1e33,0x1e32},{0x1e34,0x1e34,0x1e35,0x1e34}, +{0x1e35,0x1e34,0x1e35,0x1e34},{0x1e36,0x1e36,0x1e37,0x1e36},{0x1e37,0x1e36,0x1e37,0x1e36},{0x1e38,0x1e38,0x1e39,0x1e38}, +{0x1e39,0x1e38,0x1e39,0x1e38},{0x1e3a,0x1e3a,0x1e3b,0x1e3a},{0x1e3b,0x1e3a,0x1e3b,0x1e3a},{0x1e3c,0x1e3c,0x1e3d,0x1e3c}, +{0x1e3d,0x1e3c,0x1e3d,0x1e3c},{0x1e3e,0x1e3e,0x1e3f,0x1e3e},{0x1e3f,0x1e3e,0x1e3f,0x1e3e},{0x1e40,0x1e40,0x1e41,0x1e40}, +{0xa640,0xa640,0xa641,0xa640},{0x1e41,0x1e40,0x1e41,0x1e40},{0xa641,0xa640,0xa641,0xa640},{0x1e42,0x1e42,0x1e43,0x1e42}, +{0xa642,0xa642,0xa643,0xa642},{0xa643,0xa642,0xa643,0xa642},{0x1e43,0x1e42,0x1e43,0x1e42},{0x1e44,0x1e44,0x1e45,0x1e44}, +{0xa644,0xa644,0xa645,0xa644},{0x1e45,0x1e44,0x1e45,0x1e44},{0xa645,0xa644,0xa645,0xa644},{0x1e46,0x1e46,0x1e47,0x1e46}, +{0xa646,0xa646,0xa647,0xa646},{0xa647,0xa646,0xa647,0xa646},{0x1e47,0x1e46,0x1e47,0x1e46},{0xa648,0xa648,0xa649,0xa648}, +{0x1e48,0x1e48,0x1e49,0x1e48},{0xa649,0xa648,0xa649,0xa648},{0x1e49,0x1e48,0x1e49,0x1e48},{0x1e4a,0x1e4a,0x1e4b,0x1e4a}, +{0xa64a,0xa64a,0xa64b,0xa64a},{0xa64b,0xa64a,0xa64b,0xa64a},{0x1e4b,0x1e4a,0x1e4b,0x1e4a},{0xa64c,0xa64c,0xa64d,0xa64c}, +{0x1e4c,0x1e4c,0x1e4d,0x1e4c},{0x1e4d,0x1e4c,0x1e4d,0x1e4c},{0xa64d,0xa64c,0xa64d,0xa64c},{0xa64e,0xa64e,0xa64f,0xa64e}, +{0x1e4e,0x1e4e,0x1e4f,0x1e4e},{0xa64f,0xa64e,0xa64f,0xa64e},{0x1e4f,0x1e4e,0x1e4f,0x1e4e},{0x1e50,0x1e50,0x1e51,0x1e50}, +{0xa650,0xa650,0xa651,0xa650},{0x1e51,0x1e50,0x1e51,0x1e50},{0xa651,0xa650,0xa651,0xa650},{0x1e52,0x1e52,0x1e53,0x1e52}, +{0xa652,0xa652,0xa653,0xa652},{0xa653,0xa652,0xa653,0xa652},{0x1e53,0x1e52,0x1e53,0x1e52},{0xa654,0xa654,0xa655,0xa654}, +{0x1e54,0x1e54,0x1e55,0x1e54},{0xa655,0xa654,0xa655,0xa654},{0x1e55,0x1e54,0x1e55,0x1e54},{0xa656,0xa656,0xa657,0xa656}, +{0x1e56,0x1e56,0x1e57,0x1e56},{0x1e57,0x1e56,0x1e57,0x1e56},{0xa657,0xa656,0xa657,0xa656},{0xa658,0xa658,0xa659,0xa658}, +{0x1e58,0x1e58,0x1e59,0x1e58},{0x1e59,0x1e58,0x1e59,0x1e58},{0xa659,0xa658,0xa659,0xa658},{0xa65a,0xa65a,0xa65b,0xa65a}, +{0x1e5a,0x1e5a,0x1e5b,0x1e5a},{0x1e5b,0x1e5a,0x1e5b,0x1e5a},{0xa65b,0xa65a,0xa65b,0xa65a},{0xa65c,0xa65c,0xa65d,0xa65c}, +{0x1e5c,0x1e5c,0x1e5d,0x1e5c},{0x1e5d,0x1e5c,0x1e5d,0x1e5c},{0xa65d,0xa65c,0xa65d,0xa65c},{0xa65e,0xa65e,0xa65f,0xa65e}, +{0x1e5e,0x1e5e,0x1e5f,0x1e5e},{0x1e5f,0x1e5e,0x1e5f,0x1e5e},{0xa65f,0xa65e,0xa65f,0xa65e},{0xa660,0xa660,0xa661,0xa660}, +{0x1e60,0x1e60,0x1e61,0x1e60},{0x1e61,0x1e60,0x1e61,0x1e60},{0xa661,0xa660,0xa661,0xa660},{0xa662,0xa662,0xa663,0xa662}, +{0x1e62,0x1e62,0x1e63,0x1e62},{0xa663,0xa662,0xa663,0xa662},{0x1e63,0x1e62,0x1e63,0x1e62},{0xa664,0xa664,0xa665,0xa664}, +{0x1e64,0x1e64,0x1e65,0x1e64},{0x1e65,0x1e64,0x1e65,0x1e64},{0xa665,0xa664,0xa665,0xa664},{0x1e66,0x1e66,0x1e67,0x1e66}, +{0xa666,0xa666,0xa667,0xa666},{0xa667,0xa666,0xa667,0xa666},{0x1e67,0x1e66,0x1e67,0x1e66},{0xa668,0xa668,0xa669,0xa668}, +{0x1e68,0x1e68,0x1e69,0x1e68},{0x1e69,0x1e68,0x1e69,0x1e68},{0xa669,0xa668,0xa669,0xa668},{0x1e6a,0x1e6a,0x1e6b,0x1e6a}, +{0xa66a,0xa66a,0xa66b,0xa66a},{0x1e6b,0x1e6a,0x1e6b,0x1e6a},{0xa66b,0xa66a,0xa66b,0xa66a},{0xa66c,0xa66c,0xa66d,0xa66c}, +{0x1e6c,0x1e6c,0x1e6d,0x1e6c},{0xa66d,0xa66c,0xa66d,0xa66c},{0x1e6d,0x1e6c,0x1e6d,0x1e6c},{0x1e6e,0x1e6e,0x1e6f,0x1e6e}, +{0x1e6f,0x1e6e,0x1e6f,0x1e6e},{0x1e70,0x1e70,0x1e71,0x1e70},{0x1e71,0x1e70,0x1e71,0x1e70},{0x1e72,0x1e72,0x1e73,0x1e72}, +{0x1e73,0x1e72,0x1e73,0x1e72},{0x1e74,0x1e74,0x1e75,0x1e74},{0x1e75,0x1e74,0x1e75,0x1e74},{0x1e76,0x1e76,0x1e77,0x1e76}, +{0x1e77,0x1e76,0x1e77,0x1e76},{0x1e78,0x1e78,0x1e79,0x1e78},{0x1e79,0x1e78,0x1e79,0x1e78},{0x1e7a,0x1e7a,0x1e7b,0x1e7a}, +{0x1e7b,0x1e7a,0x1e7b,0x1e7a},{0x1e7c,0x1e7c,0x1e7d,0x1e7c},{0x1e7d,0x1e7c,0x1e7d,0x1e7c},{0x1e7e,0x1e7e,0x1e7f,0x1e7e}, +{0x1e7f,0x1e7e,0x1e7f,0x1e7e},{0x1e80,0x1e80,0x1e81,0x1e80},{0xa680,0xa680,0xa681,0xa680},{0xa681,0xa680,0xa681,0xa680}, +{0x1e81,0x1e80,0x1e81,0x1e80},{0x1e82,0x1e82,0x1e83,0x1e82},{0xa682,0xa682,0xa683,0xa682},{0xa683,0xa682,0xa683,0xa682}, +{0x1e83,0x1e82,0x1e83,0x1e82},{0xa684,0xa684,0xa685,0xa684},{0x1e84,0x1e84,0x1e85,0x1e84},{0x1e85,0x1e84,0x1e85,0x1e84}, +{0xa685,0xa684,0xa685,0xa684},{0x1e86,0x1e86,0x1e87,0x1e86},{0xa686,0xa686,0xa687,0xa686},{0xa687,0xa686,0xa687,0xa686}, +{0x1e87,0x1e86,0x1e87,0x1e86},{0x1e88,0x1e88,0x1e89,0x1e88},{0xa688,0xa688,0xa689,0xa688},{0xa689,0xa688,0xa689,0xa688}, +{0x1e89,0x1e88,0x1e89,0x1e88},{0xa68a,0xa68a,0xa68b,0xa68a},{0x1e8a,0x1e8a,0x1e8b,0x1e8a},{0x1e8b,0x1e8a,0x1e8b,0x1e8a}, +{0xa68b,0xa68a,0xa68b,0xa68a},{0xa68c,0xa68c,0xa68d,0xa68c},{0x1e8c,0x1e8c,0x1e8d,0x1e8c},{0x1e8d,0x1e8c,0x1e8d,0x1e8c}, +{0xa68d,0xa68c,0xa68d,0xa68c},{0xa68e,0xa68e,0xa68f,0xa68e},{0x1e8e,0x1e8e,0x1e8f,0x1e8e},{0xa68f,0xa68e,0xa68f,0xa68e}, +{0x1e8f,0x1e8e,0x1e8f,0x1e8e},{0xa690,0xa690,0xa691,0xa690},{0x1e90,0x1e90,0x1e91,0x1e90},{0xa691,0xa690,0xa691,0xa690}, +{0x1e91,0x1e90,0x1e91,0x1e90},{0x1e92,0x1e92,0x1e93,0x1e92},{0xa692,0xa692,0xa693,0xa692},{0xa693,0xa692,0xa693,0xa692}, +{0x1e93,0x1e92,0x1e93,0x1e92},{0xa694,0xa694,0xa695,0xa694},{0x1e94,0x1e94,0x1e95,0x1e94},{0x1e95,0x1e94,0x1e95,0x1e94}, +{0xa695,0xa694,0xa695,0xa694},{0xa696,0xa696,0xa697,0xa696},{0xa697,0xa696,0xa697,0xa696},{0x1e9b,0x1e60,0x1e9b,0x1e60}, +{0x1e9e,0x1e9e,0x00df,0x1e9e},{0x1ea0,0x1ea0,0x1ea1,0x1ea0},{0x1ea1,0x1ea0,0x1ea1,0x1ea0},{0x1ea2,0x1ea2,0x1ea3,0x1ea2}, +{0x1ea3,0x1ea2,0x1ea3,0x1ea2},{0x1ea4,0x1ea4,0x1ea5,0x1ea4},{0x1ea5,0x1ea4,0x1ea5,0x1ea4},{0x1ea6,0x1ea6,0x1ea7,0x1ea6}, +{0x1ea7,0x1ea6,0x1ea7,0x1ea6},{0x1ea8,0x1ea8,0x1ea9,0x1ea8},{0x1ea9,0x1ea8,0x1ea9,0x1ea8},{0x1eaa,0x1eaa,0x1eab,0x1eaa}, +{0x1eab,0x1eaa,0x1eab,0x1eaa},{0x1eac,0x1eac,0x1ead,0x1eac},{0x1ead,0x1eac,0x1ead,0x1eac},{0x1eae,0x1eae,0x1eaf,0x1eae}, +{0x1eaf,0x1eae,0x1eaf,0x1eae},{0x1eb0,0x1eb0,0x1eb1,0x1eb0},{0x1eb1,0x1eb0,0x1eb1,0x1eb0},{0x1eb2,0x1eb2,0x1eb3,0x1eb2}, +{0x1eb3,0x1eb2,0x1eb3,0x1eb2},{0x1eb4,0x1eb4,0x1eb5,0x1eb4},{0x1eb5,0x1eb4,0x1eb5,0x1eb4},{0x1eb6,0x1eb6,0x1eb7,0x1eb6}, +{0x1eb7,0x1eb6,0x1eb7,0x1eb6},{0x1eb8,0x1eb8,0x1eb9,0x1eb8},{0x1eb9,0x1eb8,0x1eb9,0x1eb8},{0x1eba,0x1eba,0x1ebb,0x1eba}, +{0x1ebb,0x1eba,0x1ebb,0x1eba},{0x1ebc,0x1ebc,0x1ebd,0x1ebc},{0x1ebd,0x1ebc,0x1ebd,0x1ebc},{0x1ebe,0x1ebe,0x1ebf,0x1ebe}, +{0x1ebf,0x1ebe,0x1ebf,0x1ebe},{0x1ec0,0x1ec0,0x1ec1,0x1ec0},{0x1ec1,0x1ec0,0x1ec1,0x1ec0},{0x1ec2,0x1ec2,0x1ec3,0x1ec2}, +{0x1ec3,0x1ec2,0x1ec3,0x1ec2},{0x1ec4,0x1ec4,0x1ec5,0x1ec4},{0x1ec5,0x1ec4,0x1ec5,0x1ec4},{0x1ec6,0x1ec6,0x1ec7,0x1ec6}, +{0x1ec7,0x1ec6,0x1ec7,0x1ec6},{0x1ec8,0x1ec8,0x1ec9,0x1ec8},{0x1ec9,0x1ec8,0x1ec9,0x1ec8},{0x1eca,0x1eca,0x1ecb,0x1eca}, +{0x1ecb,0x1eca,0x1ecb,0x1eca},{0x1ecc,0x1ecc,0x1ecd,0x1ecc},{0x1ecd,0x1ecc,0x1ecd,0x1ecc},{0x1ece,0x1ece,0x1ecf,0x1ece}, +{0x1ecf,0x1ece,0x1ecf,0x1ece},{0x1ed0,0x1ed0,0x1ed1,0x1ed0},{0x1ed1,0x1ed0,0x1ed1,0x1ed0},{0x1ed2,0x1ed2,0x1ed3,0x1ed2}, +{0x1ed3,0x1ed2,0x1ed3,0x1ed2},{0x1ed4,0x1ed4,0x1ed5,0x1ed4},{0x1ed5,0x1ed4,0x1ed5,0x1ed4},{0x1ed6,0x1ed6,0x1ed7,0x1ed6}, +{0x1ed7,0x1ed6,0x1ed7,0x1ed6},{0x1ed8,0x1ed8,0x1ed9,0x1ed8},{0x1ed9,0x1ed8,0x1ed9,0x1ed8},{0x1eda,0x1eda,0x1edb,0x1eda}, +{0x1edb,0x1eda,0x1edb,0x1eda},{0x1edc,0x1edc,0x1edd,0x1edc},{0x1edd,0x1edc,0x1edd,0x1edc},{0x1ede,0x1ede,0x1edf,0x1ede}, +{0x1edf,0x1ede,0x1edf,0x1ede},{0x1ee0,0x1ee0,0x1ee1,0x1ee0},{0x1ee1,0x1ee0,0x1ee1,0x1ee0},{0x1ee2,0x1ee2,0x1ee3,0x1ee2}, +{0x1ee3,0x1ee2,0x1ee3,0x1ee2},{0x1ee4,0x1ee4,0x1ee5,0x1ee4},{0x1ee5,0x1ee4,0x1ee5,0x1ee4},{0x1ee6,0x1ee6,0x1ee7,0x1ee6}, +{0x1ee7,0x1ee6,0x1ee7,0x1ee6},{0x1ee8,0x1ee8,0x1ee9,0x1ee8},{0x1ee9,0x1ee8,0x1ee9,0x1ee8},{0x1eea,0x1eea,0x1eeb,0x1eea}, +{0x1eeb,0x1eea,0x1eeb,0x1eea},{0x1eec,0x1eec,0x1eed,0x1eec},{0x1eed,0x1eec,0x1eed,0x1eec},{0x1eee,0x1eee,0x1eef,0x1eee}, +{0x1eef,0x1eee,0x1eef,0x1eee},{0x1ef0,0x1ef0,0x1ef1,0x1ef0},{0x1ef1,0x1ef0,0x1ef1,0x1ef0},{0x1ef2,0x1ef2,0x1ef3,0x1ef2}, +{0x1ef3,0x1ef2,0x1ef3,0x1ef2},{0x1ef4,0x1ef4,0x1ef5,0x1ef4},{0x1ef5,0x1ef4,0x1ef5,0x1ef4},{0x1ef6,0x1ef6,0x1ef7,0x1ef6}, +{0x1ef7,0x1ef6,0x1ef7,0x1ef6},{0x1ef8,0x1ef8,0x1ef9,0x1ef8},{0x1ef9,0x1ef8,0x1ef9,0x1ef8},{0x1efa,0x1efa,0x1efb,0x1efa}, +{0x1efb,0x1efa,0x1efb,0x1efa},{0x1efc,0x1efc,0x1efd,0x1efc},{0x1efd,0x1efc,0x1efd,0x1efc},{0x1efe,0x1efe,0x1eff,0x1efe}, +{0x1eff,0x1efe,0x1eff,0x1efe},{0x1f00,0x1f08,0x1f00,0x1f08},{0x1f01,0x1f09,0x1f01,0x1f09},{0x1f02,0x1f0a,0x1f02,0x1f0a}, +{0x1f03,0x1f0b,0x1f03,0x1f0b},{0x1f04,0x1f0c,0x1f04,0x1f0c},{0x1f05,0x1f0d,0x1f05,0x1f0d},{0x1f06,0x1f0e,0x1f06,0x1f0e}, +{0x1f07,0x1f0f,0x1f07,0x1f0f},{0x1f08,0x1f08,0x1f00,0x1f08},{0x1f09,0x1f09,0x1f01,0x1f09},{0x1f0a,0x1f0a,0x1f02,0x1f0a}, +{0x1f0b,0x1f0b,0x1f03,0x1f0b},{0x1f0c,0x1f0c,0x1f04,0x1f0c},{0x1f0d,0x1f0d,0x1f05,0x1f0d},{0x1f0e,0x1f0e,0x1f06,0x1f0e}, +{0x1f0f,0x1f0f,0x1f07,0x1f0f},{0x1f10,0x1f18,0x1f10,0x1f18},{0x1f11,0x1f19,0x1f11,0x1f19},{0x1f12,0x1f1a,0x1f12,0x1f1a}, +{0x1f13,0x1f1b,0x1f13,0x1f1b},{0x1f14,0x1f1c,0x1f14,0x1f1c},{0x1f15,0x1f1d,0x1f15,0x1f1d},{0x1f18,0x1f18,0x1f10,0x1f18}, +{0x1f19,0x1f19,0x1f11,0x1f19},{0x1f1a,0x1f1a,0x1f12,0x1f1a},{0x1f1b,0x1f1b,0x1f13,0x1f1b},{0x1f1c,0x1f1c,0x1f14,0x1f1c}, +{0x1f1d,0x1f1d,0x1f15,0x1f1d},{0x1f20,0x1f28,0x1f20,0x1f28},{0xff21,0xff21,0xff41,0xff21},{0x1f21,0x1f29,0x1f21,0x1f29}, +{0x1f22,0x1f2a,0x1f22,0x1f2a},{0xff22,0xff22,0xff42,0xff22},{0xa722,0xa722,0xa723,0xa722},{0xa723,0xa722,0xa723,0xa722}, +{0x1f23,0x1f2b,0x1f23,0x1f2b},{0xff23,0xff23,0xff43,0xff23},{0xa724,0xa724,0xa725,0xa724},{0xff24,0xff24,0xff44,0xff24}, +{0x1f24,0x1f2c,0x1f24,0x1f2c},{0xff25,0xff25,0xff45,0xff25},{0x1f25,0x1f2d,0x1f25,0x1f2d},{0xa725,0xa724,0xa725,0xa724}, +{0x1f26,0x1f2e,0x1f26,0x1f2e},{0xff26,0xff26,0xff46,0xff26},{0xa726,0xa726,0xa727,0xa726},{0xff27,0xff27,0xff47,0xff27}, +{0x1f27,0x1f2f,0x1f27,0x1f2f},{0xa727,0xa726,0xa727,0xa726},{0xa728,0xa728,0xa729,0xa728},{0xff28,0xff28,0xff48,0xff28}, +{0x1f28,0x1f28,0x1f20,0x1f28},{0xa729,0xa728,0xa729,0xa728},{0xff29,0xff29,0xff49,0xff29},{0x1f29,0x1f29,0x1f21,0x1f29}, +{0x1f2a,0x1f2a,0x1f22,0x1f2a},{0xff2a,0xff2a,0xff4a,0xff2a},{0xa72a,0xa72a,0xa72b,0xa72a},{0xff2b,0xff2b,0xff4b,0xff2b}, +{0xa72b,0xa72a,0xa72b,0xa72a},{0x1f2b,0x1f2b,0x1f23,0x1f2b},{0xa72c,0xa72c,0xa72d,0xa72c},{0xff2c,0xff2c,0xff4c,0xff2c}, +{0x1f2c,0x1f2c,0x1f24,0x1f2c},{0xa72d,0xa72c,0xa72d,0xa72c},{0x1f2d,0x1f2d,0x1f25,0x1f2d},{0xff2d,0xff2d,0xff4d,0xff2d}, +{0xff2e,0xff2e,0xff4e,0xff2e},{0xa72e,0xa72e,0xa72f,0xa72e},{0x1f2e,0x1f2e,0x1f26,0x1f2e},{0x1f2f,0x1f2f,0x1f27,0x1f2f}, +{0xff2f,0xff2f,0xff4f,0xff2f},{0xa72f,0xa72e,0xa72f,0xa72e},{0x1f30,0x1f38,0x1f30,0x1f38},{0xff30,0xff30,0xff50,0xff30}, +{0x1f31,0x1f39,0x1f31,0x1f39},{0xff31,0xff31,0xff51,0xff31},{0xa732,0xa732,0xa733,0xa732},{0x1f32,0x1f3a,0x1f32,0x1f3a}, +{0xff32,0xff32,0xff52,0xff32},{0xff33,0xff33,0xff53,0xff33},{0x1f33,0x1f3b,0x1f33,0x1f3b},{0xa733,0xa732,0xa733,0xa732}, +{0xa734,0xa734,0xa735,0xa734},{0xff34,0xff34,0xff54,0xff34},{0x1f34,0x1f3c,0x1f34,0x1f3c},{0x1f35,0x1f3d,0x1f35,0x1f3d}, +{0xff35,0xff35,0xff55,0xff35},{0xa735,0xa734,0xa735,0xa734},{0xa736,0xa736,0xa737,0xa736},{0x1f36,0x1f3e,0x1f36,0x1f3e}, +{0xff36,0xff36,0xff56,0xff36},{0xa737,0xa736,0xa737,0xa736},{0x1f37,0x1f3f,0x1f37,0x1f3f},{0xff37,0xff37,0xff57,0xff37}, +{0x1f38,0x1f38,0x1f30,0x1f38},{0xff38,0xff38,0xff58,0xff38},{0xa738,0xa738,0xa739,0xa738},{0xff39,0xff39,0xff59,0xff39}, +{0xa739,0xa738,0xa739,0xa738},{0x1f39,0x1f39,0x1f31,0x1f39},{0xff3a,0xff3a,0xff5a,0xff3a},{0xa73a,0xa73a,0xa73b,0xa73a}, +{0x1f3a,0x1f3a,0x1f32,0x1f3a},{0xa73b,0xa73a,0xa73b,0xa73a},{0x1f3b,0x1f3b,0x1f33,0x1f3b},{0x1f3c,0x1f3c,0x1f34,0x1f3c}, +{0xa73c,0xa73c,0xa73d,0xa73c},{0x1f3d,0x1f3d,0x1f35,0x1f3d},{0xa73d,0xa73c,0xa73d,0xa73c},{0xa73e,0xa73e,0xa73f,0xa73e}, +{0x1f3e,0x1f3e,0x1f36,0x1f3e},{0x1f3f,0x1f3f,0x1f37,0x1f3f},{0xa73f,0xa73e,0xa73f,0xa73e},{0x1f40,0x1f48,0x1f40,0x1f48}, +{0xa740,0xa740,0xa741,0xa740},{0x1f41,0x1f49,0x1f41,0x1f49},{0xff41,0xff21,0xff41,0xff21},{0xa741,0xa740,0xa741,0xa740}, +{0x1f42,0x1f4a,0x1f42,0x1f4a},{0xa742,0xa742,0xa743,0xa742},{0xff42,0xff22,0xff42,0xff22},{0xa743,0xa742,0xa743,0xa742}, +{0xff43,0xff23,0xff43,0xff23},{0x1f43,0x1f4b,0x1f43,0x1f4b},{0xff44,0xff24,0xff44,0xff24},{0x1f44,0x1f4c,0x1f44,0x1f4c}, +{0xa744,0xa744,0xa745,0xa744},{0xff45,0xff25,0xff45,0xff25},{0xa745,0xa744,0xa745,0xa744},{0x1f45,0x1f4d,0x1f45,0x1f4d}, +{0xa746,0xa746,0xa747,0xa746},{0xff46,0xff26,0xff46,0xff26},{0xa747,0xa746,0xa747,0xa746},{0xff47,0xff27,0xff47,0xff27}, +{0x1f48,0x1f48,0x1f40,0x1f48},{0xff48,0xff28,0xff48,0xff28},{0xa748,0xa748,0xa749,0xa748},{0xff49,0xff29,0xff49,0xff29}, +{0x1f49,0x1f49,0x1f41,0x1f49},{0xa749,0xa748,0xa749,0xa748},{0xa74a,0xa74a,0xa74b,0xa74a},{0xff4a,0xff2a,0xff4a,0xff2a}, +{0x1f4a,0x1f4a,0x1f42,0x1f4a},{0x1f4b,0x1f4b,0x1f43,0x1f4b},{0xa74b,0xa74a,0xa74b,0xa74a},{0xff4b,0xff2b,0xff4b,0xff2b}, +{0x1f4c,0x1f4c,0x1f44,0x1f4c},{0xff4c,0xff2c,0xff4c,0xff2c},{0xa74c,0xa74c,0xa74d,0xa74c},{0xa74d,0xa74c,0xa74d,0xa74c}, +{0x1f4d,0x1f4d,0x1f45,0x1f4d},{0xff4d,0xff2d,0xff4d,0xff2d},{0xff4e,0xff2e,0xff4e,0xff2e},{0xa74e,0xa74e,0xa74f,0xa74e}, +{0xff4f,0xff2f,0xff4f,0xff2f},{0xa74f,0xa74e,0xa74f,0xa74e},{0xa750,0xa750,0xa751,0xa750},{0xff50,0xff30,0xff50,0xff30}, +{0xff51,0xff31,0xff51,0xff31},{0x1f51,0x1f59,0x1f51,0x1f59},{0xa751,0xa750,0xa751,0xa750},{0xff52,0xff32,0xff52,0xff32}, +{0xa752,0xa752,0xa753,0xa752},{0xa753,0xa752,0xa753,0xa752},{0x1f53,0x1f5b,0x1f53,0x1f5b},{0xff53,0xff33,0xff53,0xff33}, +{0xa754,0xa754,0xa755,0xa754},{0xff54,0xff34,0xff54,0xff34},{0xff55,0xff35,0xff55,0xff35},{0x1f55,0x1f5d,0x1f55,0x1f5d}, +{0xa755,0xa754,0xa755,0xa754},{0xff56,0xff36,0xff56,0xff36},{0xa756,0xa756,0xa757,0xa756},{0xa757,0xa756,0xa757,0xa756}, +{0xff57,0xff37,0xff57,0xff37},{0x1f57,0x1f5f,0x1f57,0x1f5f},{0xa758,0xa758,0xa759,0xa758},{0xff58,0xff38,0xff58,0xff38}, +{0xa759,0xa758,0xa759,0xa758},{0xff59,0xff39,0xff59,0xff39},{0x1f59,0x1f59,0x1f51,0x1f59},{0xff5a,0xff3a,0xff5a,0xff3a}, +{0xa75a,0xa75a,0xa75b,0xa75a},{0xa75b,0xa75a,0xa75b,0xa75a},{0x1f5b,0x1f5b,0x1f53,0x1f5b},{0xa75c,0xa75c,0xa75d,0xa75c}, +{0x1f5d,0x1f5d,0x1f55,0x1f5d},{0xa75d,0xa75c,0xa75d,0xa75c},{0xa75e,0xa75e,0xa75f,0xa75e},{0xa75f,0xa75e,0xa75f,0xa75e}, +{0x1f5f,0x1f5f,0x1f57,0x1f5f},{0xa760,0xa760,0xa761,0xa760},{0x1f60,0x1f68,0x1f60,0x1f68},{0xa761,0xa760,0xa761,0xa760}, +{0x1f61,0x1f69,0x1f61,0x1f69},{0xa762,0xa762,0xa763,0xa762},{0x1f62,0x1f6a,0x1f62,0x1f6a},{0xa763,0xa762,0xa763,0xa762}, +{0x1f63,0x1f6b,0x1f63,0x1f6b},{0xa764,0xa764,0xa765,0xa764},{0x1f64,0x1f6c,0x1f64,0x1f6c},{0x1f65,0x1f6d,0x1f65,0x1f6d}, +{0xa765,0xa764,0xa765,0xa764},{0x1f66,0x1f6e,0x1f66,0x1f6e},{0xa766,0xa766,0xa767,0xa766},{0xa767,0xa766,0xa767,0xa766}, +{0x1f67,0x1f6f,0x1f67,0x1f6f},{0x1f68,0x1f68,0x1f60,0x1f68},{0xa768,0xa768,0xa769,0xa768},{0x1f69,0x1f69,0x1f61,0x1f69}, +{0xa769,0xa768,0xa769,0xa768},{0x1f6a,0x1f6a,0x1f62,0x1f6a},{0xa76a,0xa76a,0xa76b,0xa76a},{0xa76b,0xa76a,0xa76b,0xa76a}, +{0x1f6b,0x1f6b,0x1f63,0x1f6b},{0xa76c,0xa76c,0xa76d,0xa76c},{0x1f6c,0x1f6c,0x1f64,0x1f6c},{0xa76d,0xa76c,0xa76d,0xa76c}, +{0x1f6d,0x1f6d,0x1f65,0x1f6d},{0xa76e,0xa76e,0xa76f,0xa76e},{0x1f6e,0x1f6e,0x1f66,0x1f6e},{0xa76f,0xa76e,0xa76f,0xa76e}, +{0x1f6f,0x1f6f,0x1f67,0x1f6f},{0x1f70,0x1fba,0x1f70,0x1fba},{0x1f71,0x1fbb,0x1f71,0x1fbb},{0x1f72,0x1fc8,0x1f72,0x1fc8}, +{0x1f73,0x1fc9,0x1f73,0x1fc9},{0x1f74,0x1fca,0x1f74,0x1fca},{0x1f75,0x1fcb,0x1f75,0x1fcb},{0x1f76,0x1fda,0x1f76,0x1fda}, +{0x1f77,0x1fdb,0x1f77,0x1fdb},{0x1f78,0x1ff8,0x1f78,0x1ff8},{0x1f79,0x1ff9,0x1f79,0x1ff9},{0xa779,0xa779,0xa77a,0xa779}, +{0x1f7a,0x1fea,0x1f7a,0x1fea},{0xa77a,0xa779,0xa77a,0xa779},{0x1f7b,0x1feb,0x1f7b,0x1feb},{0xa77b,0xa77b,0xa77c,0xa77b}, +{0x1f7c,0x1ffa,0x1f7c,0x1ffa},{0xa77c,0xa77b,0xa77c,0xa77b},{0xa77d,0xa77d,0x1d79,0xa77d},{0x1f7d,0x1ffb,0x1f7d,0x1ffb}, +{0xa77e,0xa77e,0xa77f,0xa77e},{0xa77f,0xa77e,0xa77f,0xa77e},{0xa780,0xa780,0xa781,0xa780},{0x1f80,0x1f88,0x1f80,0x1f88}, +{0x1f81,0x1f89,0x1f81,0x1f89},{0xa781,0xa780,0xa781,0xa780},{0xa782,0xa782,0xa783,0xa782},{0x1f82,0x1f8a,0x1f82,0x1f8a}, +{0xa783,0xa782,0xa783,0xa782},{0x1f83,0x1f8b,0x1f83,0x1f8b},{0xa784,0xa784,0xa785,0xa784},{0x1f84,0x1f8c,0x1f84,0x1f8c}, +{0x1f85,0x1f8d,0x1f85,0x1f8d},{0xa785,0xa784,0xa785,0xa784},{0x1f86,0x1f8e,0x1f86,0x1f8e},{0xa786,0xa786,0xa787,0xa786}, +{0xa787,0xa786,0xa787,0xa786},{0x1f87,0x1f8f,0x1f87,0x1f8f},{0x1f88,0x1f88,0x1f80,0x1f88},{0x1f89,0x1f89,0x1f81,0x1f89}, +{0x1f8a,0x1f8a,0x1f82,0x1f8a},{0xa78b,0xa78b,0xa78c,0xa78b},{0x1f8b,0x1f8b,0x1f83,0x1f8b},{0x1f8c,0x1f8c,0x1f84,0x1f8c}, +{0xa78c,0xa78b,0xa78c,0xa78b},{0x1f8d,0x1f8d,0x1f85,0x1f8d},{0xa78d,0xa78d,0x0265,0xa78d},{0x1f8e,0x1f8e,0x1f86,0x1f8e}, +{0x1f8f,0x1f8f,0x1f87,0x1f8f},{0xa790,0xa790,0xa791,0xa790},{0x1f90,0x1f98,0x1f90,0x1f98},{0x1f91,0x1f99,0x1f91,0x1f99}, +{0xa791,0xa790,0xa791,0xa790},{0x1f92,0x1f9a,0x1f92,0x1f9a},{0x1f93,0x1f9b,0x1f93,0x1f9b},{0x1f94,0x1f9c,0x1f94,0x1f9c}, +{0x1f95,0x1f9d,0x1f95,0x1f9d},{0x1f96,0x1f9e,0x1f96,0x1f9e},{0x1f97,0x1f9f,0x1f97,0x1f9f},{0x1f98,0x1f98,0x1f90,0x1f98}, +{0x1f99,0x1f99,0x1f91,0x1f99},{0x1f9a,0x1f9a,0x1f92,0x1f9a},{0x1f9b,0x1f9b,0x1f93,0x1f9b},{0x1f9c,0x1f9c,0x1f94,0x1f9c}, +{0x1f9d,0x1f9d,0x1f95,0x1f9d},{0x1f9e,0x1f9e,0x1f96,0x1f9e},{0x1f9f,0x1f9f,0x1f97,0x1f9f},{0x1fa0,0x1fa8,0x1fa0,0x1fa8}, +{0xa7a0,0xa7a0,0xa7a1,0xa7a0},{0x1fa1,0x1fa9,0x1fa1,0x1fa9},{0xa7a1,0xa7a0,0xa7a1,0xa7a0},{0x1fa2,0x1faa,0x1fa2,0x1faa}, +{0xa7a2,0xa7a2,0xa7a3,0xa7a2},{0x1fa3,0x1fab,0x1fa3,0x1fab},{0xa7a3,0xa7a2,0xa7a3,0xa7a2},{0x1fa4,0x1fac,0x1fa4,0x1fac}, +{0xa7a4,0xa7a4,0xa7a5,0xa7a4},{0xa7a5,0xa7a4,0xa7a5,0xa7a4},{0x1fa5,0x1fad,0x1fa5,0x1fad},{0x1fa6,0x1fae,0x1fa6,0x1fae}, +{0xa7a6,0xa7a6,0xa7a7,0xa7a6},{0x1fa7,0x1faf,0x1fa7,0x1faf},{0xa7a7,0xa7a6,0xa7a7,0xa7a6},{0x1fa8,0x1fa8,0x1fa0,0x1fa8}, +{0xa7a8,0xa7a8,0xa7a9,0xa7a8},{0x1fa9,0x1fa9,0x1fa1,0x1fa9},{0xa7a9,0xa7a8,0xa7a9,0xa7a8},{0x1faa,0x1faa,0x1fa2,0x1faa}, +{0x1fab,0x1fab,0x1fa3,0x1fab},{0x1fac,0x1fac,0x1fa4,0x1fac},{0x1fad,0x1fad,0x1fa5,0x1fad},{0x1fae,0x1fae,0x1fa6,0x1fae}, +{0x1faf,0x1faf,0x1fa7,0x1faf},{0x1fb0,0x1fb8,0x1fb0,0x1fb8},{0x1fb1,0x1fb9,0x1fb1,0x1fb9},{0x1fb3,0x1fbc,0x1fb3,0x1fbc}, +{0x1fb8,0x1fb8,0x1fb0,0x1fb8},{0x1fb9,0x1fb9,0x1fb1,0x1fb9},{0x1fba,0x1fba,0x1f70,0x1fba},{0x1fbb,0x1fbb,0x1f71,0x1fbb}, +{0x1fbc,0x1fbc,0x1fb3,0x1fbc},{0x1fbe,0x0399,0x1fbe,0x0399},{0x1fc3,0x1fcc,0x1fc3,0x1fcc},{0x1fc8,0x1fc8,0x1f72,0x1fc8}, +{0x1fc9,0x1fc9,0x1f73,0x1fc9},{0x1fca,0x1fca,0x1f74,0x1fca},{0x1fcb,0x1fcb,0x1f75,0x1fcb},{0x1fcc,0x1fcc,0x1fc3,0x1fcc}, +{0x1fd0,0x1fd8,0x1fd0,0x1fd8},{0x1fd1,0x1fd9,0x1fd1,0x1fd9},{0x1fd8,0x1fd8,0x1fd0,0x1fd8},{0x1fd9,0x1fd9,0x1fd1,0x1fd9}, +{0x1fda,0x1fda,0x1f76,0x1fda},{0x1fdb,0x1fdb,0x1f77,0x1fdb},{0x1fe0,0x1fe8,0x1fe0,0x1fe8},{0x1fe1,0x1fe9,0x1fe1,0x1fe9}, +{0x1fe5,0x1fec,0x1fe5,0x1fec},{0x1fe8,0x1fe8,0x1fe0,0x1fe8},{0x1fe9,0x1fe9,0x1fe1,0x1fe9},{0x1fea,0x1fea,0x1f7a,0x1fea}, +{0x1feb,0x1feb,0x1f7b,0x1feb},{0x1fec,0x1fec,0x1fe5,0x1fec},{0x1ff3,0x1ffc,0x1ff3,0x1ffc},{0x1ff8,0x1ff8,0x1f78,0x1ff8}, +{0x1ff9,0x1ff9,0x1f79,0x1ff9},{0x1ffa,0x1ffa,0x1f7c,0x1ffa},{0x1ffb,0x1ffb,0x1f7d,0x1ffb},{0x1ffc,0x1ffc,0x1ff3,0x1ffc}, +{0,0,0,0}}; + +const unsigned unicode_case_offset[2048]={ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, + 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 87, 89, 91, 93, 95, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 192, 193, 194, 195, 197, 199, 200, 201, 202, + 203, 204, 205, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 228, 229, 230, 231, 232, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, + 283, 285, 287, 289, 291, 293, 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, + 315, 316, 317, 318, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 357, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 371, 371, 372, 373, 373, + 374, 374, 374, 374, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 484, 484, 484, 484, 484, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 511, 512, 513, 513, 514, 514, 515, 515, 515, 515, + 515, 516, 516, 516, 517, 517, 518, 518, 518, 519, 520, 520, 521, 521, 521, 521, + 522, 522, 523, 524, 524, 524, 525, 525, 525, 525, 525, 525, 525, 525, 526, 526, + 526, 527, 527, 527, 528, 528, 528, 528, 528, 529, 530, 531, 532, 533, 533, 533, + 533, 533, 533, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 536, 537, 538, 539, 539, 539, 540, 541, 541, 541, 541, 542, 543, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 545, 545, 546, 547, 548, 548, 549, 549, 550, + 551, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 614, 614, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 644, 645, 646, 646, 647, 648, 649, 650, 651, 651, 652, 653, + 654, 657, 660, 663, 666, 669, 672, 675, 678, 681, 684, 687, 690, 693, 696, 699, + 702, 705, 708, 711, 714, 717, 720, 723, 726, 729, 732, 735, 738, 741, 744, 747, + 750, 753, 756, 759, 762, 765, 768, 771, 774, 777, 780, 783, 786, 789, 792, 795, + 797, 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, + 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, 875, 878, 881, 884, 887, 890, + 893, 895, 897, 899, 901, 903, 905, 907, 909, 911, 913, 915, 917, 919, 921, 923, + 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, + 956, 958, 959, 961, 963, 964, 966, 968, 969, 970, 971, 972, 973, 974, 975, 977, + 979, 981, 983, 984, 985, 986, 987, 988, 989, 990, 991, 993, 995, 997, 999,1001, +1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033, +1035,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057,1059,1061,1063,1065, +1067,1069,1071,1073,1075,1077,1079,1082,1085,1088,1091,1094,1097,1100,1103,1106, +1109,1112,1115,1118,1121,1124,1127,1130,1133,1136,1139,1142,1145,1148,1151,1154, +1157,1160,1163,1166,1169,1172,1175,1178,1181,1184,1187,1190,1193,1196,1199,1202, +1205,1208,1211,1214,1217,1219,1221,1223,1225,1227,1229,1230,1232,1234,1236,1238, +1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254, +1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285, +1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317, +1319,1321,1323,1325,1327,1329,1331,1332,1333,1333,1333,1333,1333,1333,1333,1333, +1333,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347, +1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363, +1364,1365,1366,1367,1368,1369,1370,1371,1371,1371,1371,1371,1371,1371,1371,1371, +1371,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385, +1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1397,1398,1399,1400,1402,1403, +1404,1405,1406,1407,1408,1409,1410,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411,1411, +1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426, +1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442, +1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458, +1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474, +1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505, +1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537, +1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1568, +1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584, +1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615, +1617,1619,1621,1623,1625,1627,1629,1630,1631,1631,1631,1631,1632,1632,1632,1633, +1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648, +1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664, +1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680, +1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696, +1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712, +1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728, +1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744, +1745,1746,1747,1748,1749,1750,1751,1751,1751,1752,1753,1754,1755,1756,1757,1757, +1757,1758,1760,1763,1766,1769,1772,1775,1778,1781,1784,1787,1790,1793,1796,1799, +1802,1804,1806,1809,1812,1815,1818,1821,1824,1827,1830,1833,1835,1837,1839,1841, +1843,1845,1848,1851,1854,1857,1860,1862,1864,1867,1870,1873,1876,1879,1882,1884, +1886,1888,1891,1893,1896,1898,1901,1903,1906,1908,1911,1913,1915,1916,1918,1919, +1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951, +1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1964,1966,1968,1970,1972,1973, +1974,1976,1978,1980,1982,1984,1986,1988,1990,1991,1992,1993,1995,1997,1999,2000, +2001,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, +2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2040,2041,2042,2043,2044, +2045,2046,2047,2047,2048,2048,2048,2048,2048,2049,2050,2051,2052,2053,2053,2054, +2054,2054,2054,2054,2055,2055,2055,2055,2055,2056,2057,2058,2059,2060,2060,2060, +2060,2061,2062,2062,2062,2062,2062,2062,2062,2063,2064,2065,2066,2066,2066,2066, +2066,2067,2068,2068,2068,2068,2069,2069,2069,2070,2071,2072,2073,2074,2074,2074, +2074,2074,2074,2074,2075,2075,2075,2075,2075,2076,2077,2078,2079,2080,2080,2080 +}; diff --git a/unicode/unicode_wcwidth.c b/unicode/unicode_wcwidth.c new file mode 100644 index 0000000..372f7a7 --- /dev/null +++ b/unicode/unicode_wcwidth.c @@ -0,0 +1,71 @@ +#include "unicode_config.h" +#include "unicode.h" + +#include "eastasianwidth.h" +#include "linebreaktab_internal.h" + +#include <stdlib.h> + +int unicode_wcwidth(unicode_char c) +{ + size_t b=0; + size_t e=sizeof(unicode_wcwidth_tab)/sizeof(unicode_wcwidth_tab[0]); + + while (b < e) + { + size_t n=b + (e-b)/2; + + if (c >= unicode_wcwidth_tab[n][0]) + { + if (c <= unicode_wcwidth_tab[n][1]) + return 2; + b=n+1; + } + else + { + e=n; + } + } + + switch (unicode_lb_lookup(c)) { + case UNICODE_LB_BK: + case UNICODE_LB_CR: + case UNICODE_LB_LF: + case UNICODE_LB_CM: + case UNICODE_LB_NL: + case UNICODE_LB_WJ: + case UNICODE_LB_ZW: + return 0; + default: + break; + } + return 1; +} + +int unicode_isspace(unicode_char ch) +{ + if (ch == 9) + return 1; + + switch (unicode_lb_lookup(ch)) { + case UNICODE_LB_BK: + case UNICODE_LB_CR: + case UNICODE_LB_LF: + case UNICODE_LB_NL: + case UNICODE_LB_SP: + return 1; + } + + return 0; +} + +size_t unicode_wcwidth_str(const unicode_char *c) +{ + size_t w=0; + + while (*c) + w += unicode_wcwidth(*c++); + + + return w; +} diff --git a/unicode/unicode_wordbreak.c b/unicode/unicode_wordbreak.c new file mode 100644 index 0000000..dee4b52 --- /dev/null +++ b/unicode/unicode_wordbreak.c @@ -0,0 +1,448 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +#include <unistd.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include "wordbreaktab_internal.h" +#include "wordbreaktab.h" + +struct unicode_wb_info { + int (*cb_func)(int, void *); + void *cb_arg; + + uint8_t prevclass; + size_t wb4_cnt; + + size_t wb4_extra_cnt; + + int (*next_handler)(unicode_wb_info_t, uint8_t); + int (*end_handler)(unicode_wb_info_t); +}; + +static int sot(unicode_wb_info_t i, uint8_t cl); +static int wb4(unicode_wb_info_t i); +static int wb1and2_done(unicode_wb_info_t i, uint8_t cl); + +static int seen_wb67_handler(unicode_wb_info_t i, uint8_t cl); +static int seen_wb67_end_handler(unicode_wb_info_t i); +static int wb67_done(unicode_wb_info_t i, uint8_t prevclass, uint8_t cl); + +static int seen_wb1112_handler(unicode_wb_info_t i, uint8_t cl); +static int seen_wb1112_end_handler(unicode_wb_info_t i); +static int wb1112_done(unicode_wb_info_t i, uint8_t prevclass, uint8_t cl); + +unicode_wb_info_t unicode_wb_init(int (*cb_func)(int, void *), + void *cb_arg) +{ + unicode_wb_info_t i=calloc(1, sizeof(struct unicode_wb_info)); + + if (!i) + return NULL; + + i->next_handler=sot; + i->cb_func=cb_func; + i->cb_arg=cb_arg; + return i; +} + +int unicode_wb_end(unicode_wb_info_t i) +{ + int rc; + + if (i->end_handler) + rc=(*i->end_handler)(i); + else + rc=wb4(i); + + free(i); + return rc; +} + +int unicode_wb_next_cnt(unicode_wb_info_t i, + const unicode_char *chars, + size_t cnt) +{ + int rc; + + while (cnt) + { + rc=unicode_wb_next(i, *chars++); + --cnt; + if (rc) + return rc; + } + return 0; +} + +int unicode_wb_next(unicode_wb_info_t i, unicode_char ch) +{ + return (*i->next_handler) + (i, unicode_tab_lookup(ch, + unicode_indextab, + sizeof(unicode_indextab) + / sizeof(unicode_indextab[0]), + unicode_rangetab, + unicode_classtab, + UNICODE_WB_OTHER)); +} + +static int wb4(unicode_wb_info_t i) +{ + int rc=0; + + while (i->wb4_cnt > 0) + { + --i->wb4_cnt; + + if (rc == 0) + rc=(*i->cb_func)(0, i->cb_arg); + } + return rc; +} + +static int result(unicode_wb_info_t i, int flag) +{ + int rc=wb4(i); + + if (rc == 0) + rc=(*i->cb_func)(flag, i->cb_arg); + + return rc; +} + +#define SET_HANDLER(next,end) (i->next_handler=next, i->end_handler=end) + +static int sot(unicode_wb_info_t i, uint8_t cl) +{ + i->prevclass=cl; + SET_HANDLER(wb1and2_done, NULL); + + return result(i, 1); /* WB1 */ +} + +static int wb1and2_done(unicode_wb_info_t i, uint8_t cl) +{ + uint8_t prevclass=i->prevclass; + + i->prevclass=cl; + + if (prevclass == UNICODE_WB_CR && cl == UNICODE_WB_LF) + return result(i, 0); /* WB3 */ + + switch (prevclass) { + case UNICODE_WB_CR: + case UNICODE_WB_LF: + case UNICODE_WB_Newline: + return result(i, 1); /* WB3a */ + } + + switch (cl) { + case UNICODE_WB_CR: + case UNICODE_WB_LF: + case UNICODE_WB_Newline: + return result(i, 1); /* WB3b */ + } + + if (cl == UNICODE_WB_Extend || cl == UNICODE_WB_Format) + { + i->prevclass=prevclass; + ++i->wb4_cnt; + return 0; /* WB4 */ + } + + if (prevclass == UNICODE_WB_ALetter && cl == UNICODE_WB_ALetter) + { + return result(i, 0); /* WB5 */ + } + + if (prevclass == UNICODE_WB_ALetter && + (cl == UNICODE_WB_MidLetter || cl == UNICODE_WB_MidNumLet)) + { + i->wb4_extra_cnt=0; + SET_HANDLER(seen_wb67_handler, seen_wb67_end_handler); + return 0; + } + + return wb67_done(i, prevclass, cl); +} + +/* +** ALetter (MidLetter | MidNumLet ) ? +** +** prevclass cl +** +** Seen ALetter (MidLetter | MidNumLet), with the second character's status +** not returned yet. +*/ + +static int seen_wb67_handler(unicode_wb_info_t i, uint8_t cl) +{ + int rc; + uint8_t prevclass; + size_t extra_cnt; + + if (cl == UNICODE_WB_Extend || cl == UNICODE_WB_Format) + { + ++i->wb4_extra_cnt; + return 0; + } + + extra_cnt=i->wb4_extra_cnt; + + /* + ** Reset the handler to the default, then check WB6 + */ + + SET_HANDLER(wb1and2_done, NULL); + + if (cl == UNICODE_WB_ALetter) + { + rc=result(i, 0); /* WB6 */ + i->wb4_cnt=extra_cnt; + + if (rc == 0) + rc=result(i, 0); /* WB7 */ + + i->prevclass=cl; + + return rc; + } + + prevclass=i->prevclass; /* This was the second character */ + + /* + ** Process the second character, starting with WB7 + */ + + rc=wb67_done(i, UNICODE_WB_ALetter, prevclass); + + i->prevclass=prevclass; + i->wb4_cnt=extra_cnt; + + if (rc == 0) + rc=(*i->next_handler)(i, cl); + /* Process the current char now */ + + return rc; +} + +/* +** Seen ALetter (MidLetter | MidNumLet), with the second character's status +** not returned yet, and now sot. +*/ + +static int seen_wb67_end_handler(unicode_wb_info_t i) +{ + int rc; + size_t extra_cnt=i->wb4_extra_cnt; + + /* + ** Process the second character, starting with WB7. + */ + + rc=wb67_done(i, UNICODE_WB_ALetter, i->prevclass); + i->wb4_cnt=extra_cnt; + if (rc == 0) + rc=wb4(i); + return rc; +} + + +static int wb67_done(unicode_wb_info_t i, uint8_t prevclass, uint8_t cl) +{ + if (prevclass == UNICODE_WB_Numeric && cl == UNICODE_WB_Numeric) + return result(i, 0); /* WB8 */ + + if (prevclass == UNICODE_WB_ALetter && cl == UNICODE_WB_Numeric) + return result(i, 0); /* WB9 */ + + if (prevclass == UNICODE_WB_Numeric && cl == UNICODE_WB_ALetter) + return result(i, 0); /* WB10 */ + + + if (prevclass == UNICODE_WB_Numeric && + (cl == UNICODE_WB_MidNum || cl == UNICODE_WB_MidNumLet)) + { + i->wb4_extra_cnt=0; + SET_HANDLER(seen_wb1112_handler, seen_wb1112_end_handler); + return 0; + } + + return wb1112_done(i, prevclass, cl); +} + +/* +** Numeric (MidNum | MidNumLet ) ? +** +** prevclass cl +** +** Seen Numeric (MidNum | MidNumLet), with the second character's status +** not returned yet. +*/ + +static int seen_wb1112_handler(unicode_wb_info_t i, uint8_t cl) +{ + int rc; + uint8_t prevclass; + size_t extra_cnt; + + if (cl == UNICODE_WB_Extend || cl == UNICODE_WB_Format) + { + ++i->wb4_extra_cnt; + return 0; + } + + extra_cnt=i->wb4_extra_cnt; + + /* + ** Reset the handler to the default, then check WB6 + */ + + SET_HANDLER(wb1and2_done, NULL); + + if (cl == UNICODE_WB_Numeric) + { + rc=result(i, 0); /* WB11 */ + i->wb4_cnt=extra_cnt; + + if (rc == 0) + rc=result(i, 0); /* WB12 */ + + i->prevclass=cl; + + return rc; + } + + prevclass=i->prevclass; /* This was the second character */ + + /* + ** Process the second character, starting with WB7 + */ + + rc=wb1112_done(i, UNICODE_WB_Numeric, prevclass); + + i->prevclass=prevclass; + i->wb4_cnt=extra_cnt; + + if (rc == 0) + rc=(*i->next_handler)(i, cl); + /* Process the current char now */ + + return rc; +} + +/* +** Seen Numeric (MidNum | MidNumLet), with the second character's status +** not returned yet, and now sot. +*/ + +static int seen_wb1112_end_handler(unicode_wb_info_t i) +{ + int rc; + size_t extra_cnt=i->wb4_extra_cnt; + + /* + ** Process the second character, starting with WB11. + */ + + rc=wb1112_done(i, UNICODE_WB_Numeric, i->prevclass); + i->wb4_cnt=extra_cnt; + if (rc == 0) + rc=wb4(i); + return rc; +} + +static int wb1112_done(unicode_wb_info_t i, uint8_t prevclass, uint8_t cl) +{ + if (prevclass == UNICODE_WB_Katakana && + cl == UNICODE_WB_Katakana) + return result(i, 0); /* WB13 */ + + switch (prevclass) { + case UNICODE_WB_ALetter: + case UNICODE_WB_Numeric: + case UNICODE_WB_Katakana: + case UNICODE_WB_ExtendNumLet: + if (cl == UNICODE_WB_ExtendNumLet) + return result(i, 0); /* WB13a */ + } + + if (prevclass == UNICODE_WB_ExtendNumLet) + switch (cl) { + case UNICODE_WB_ALetter: + case UNICODE_WB_Numeric: + case UNICODE_WB_Katakana: + return result(i, 0); /* WB13b */ + } + + return result(i, 1); /* WB14 */ +} + +/* --------------------------------------------------------------------- */ + +struct unicode_wbscan_info { + unicode_wb_info_t wb_handle; + + int found; + size_t cnt; +}; + +static int unicode_wbscan_callback(int, void *); + +unicode_wbscan_info_t unicode_wbscan_init() +{ + unicode_wbscan_info_t i=calloc(1, sizeof(struct unicode_wbscan_info)); + + if (!i) + return NULL; + + if ((i->wb_handle=unicode_wb_init(unicode_wbscan_callback, i)) == NULL) + { + free(i); + return NULL; + } + + return i; +} + +int unicode_wbscan_next(unicode_wbscan_info_t i, unicode_char ch) +{ + if (!i->found) + unicode_wb_next(i->wb_handle, ch); + + return i->found; +} + +size_t unicode_wbscan_end(unicode_wbscan_info_t i) +{ + size_t n; + + unicode_wb_end(i->wb_handle); + + n=i->cnt; + free(i); + return n; +} + +static int unicode_wbscan_callback(int flag, void *arg) +{ + unicode_wbscan_info_t i=(unicode_wbscan_info_t)arg; + + if (flag && i->cnt > 0) + i->found=1; + + if (!i->found) + ++i->cnt; + return 0; +} + diff --git a/unicode/unicodebuf.c b/unicode/unicodebuf.c new file mode 100644 index 0000000..66687c3 --- /dev/null +++ b/unicode/unicodebuf.c @@ -0,0 +1,127 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include <stdlib.h> +#include <string.h> + +void unicode_buf_init(struct unicode_buf *p, size_t max) +{ + p->ptr=0; + p->size=0; + p->len=0; + p->max=max; +} + +void unicode_buf_deinit(struct unicode_buf *p) +{ + if (p->ptr) + free(p->ptr); +} + +int unicode_buf_append(struct unicode_buf *p, + const unicode_char *uc, size_t l) +{ + if (l > p->max-p->len) + l=p->max-p->len; + + if (p->len + l > p->size) + { + size_t n=(p->len + l) * 2; + unicode_char *newp; + + if (n < 256) + n=256; + + if (n > p->max) + n=p->max; + + newp=p->ptr ? realloc(p->ptr, n * sizeof(unicode_char)) + : malloc(n * sizeof(unicode_char)); + + if (!newp) + return -1; + + p->ptr=newp; + p->size=n; + } + + memcpy(p->ptr + p->len, uc, l * sizeof(unicode_char)); + + p->len += l; + return 0; +} + +void unicode_buf_append_char(struct unicode_buf *dst, + const char *str, + size_t cnt) +{ + unicode_char unicode_buf[256]; + + while (cnt) + { + size_t n=sizeof(unicode_buf)/sizeof(unicode_buf[0]), i; + + if (n > cnt) + n=cnt; + + for (i=0; i<n; ++i) + unicode_buf[i]=(unsigned char)str[i]; + + str += n; + cnt -= n; + unicode_buf_append(dst, unicode_buf, i); + } +} + +void unicode_buf_remove(struct unicode_buf *p, + size_t pos, + size_t cnt) +{ + if (pos > p->len) + pos=p->len; + + if (cnt > p->len-pos) + cnt=p->len-pos; + + if (cnt) + memmove(p->ptr+pos+cnt, p->ptr+pos, p->len-pos-cnt); + p->len -= cnt; +} + +int unicode_buf_cmp(const struct unicode_buf *a, + const struct unicode_buf *b) +{ + size_t i; + + for (i=0; i<a->len && i<b->len; i++) + { + if (a->ptr[i] < b->ptr[i]) + return -1; + if (a->ptr[i] > b->ptr[i]) + return 1; + } + + return (a->len < b->len ? -1:a->len > b->len ? 1:0); +} + +int unicode_buf_cmp_str(const struct unicode_buf *p, const char *c, + size_t cl) +{ + size_t i; + + for (i=0; i<p->len && i < cl; ++i) + { + if (p->ptr[i] < c[i]) + return -1; + + if (p->ptr[i] > c[i]) + return 1; + } + + return (p->len < cl ? -1: p->len > cl ? 1:0); +} diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C new file mode 100644 index 0000000..e5c2824 --- /dev/null +++ b/unicode/unicodecpp.C @@ -0,0 +1,474 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" + +extern "C" { + + static int iconv_trampoline(const char *str, size_t cnt, void *arg) + { + return reinterpret_cast<mail::iconvert *>(arg) + ->converted(str, cnt); + } + + int mail::linebreak_trampoline(int value, void *ptr) + { + return (*reinterpret_cast<mail::linebreak_callback_base *> + (ptr))(value); + } + + int mail::linebreakc_trampoline(int value, unicode_char ch, void *ptr) + { + return (*reinterpret_cast<mail::linebreakc_callback_base *> + (ptr))(value, ch); + } + + int mail::wordbreak_trampoline(int value, void *ptr) + { + return (*reinterpret_cast<mail::wordbreak_callback_base *> + (ptr))(value != 0); + } + +} + +size_t unicode_wcwidth(const std::vector<unicode_char> &uc) +{ + size_t w=0; + + for (std::vector<unicode_char>::const_iterator + b(uc.begin()), e(uc.end()); b != e; ++b) + w += unicode_wcwidth(*b); + return w; +} + +mail::iconvert::iconvert() : handle(NULL) +{ +} + +mail::iconvert::~iconvert() +{ + end(); +} + +int mail::iconvert::converted(const char *, size_t) +{ + return 0; +} + +bool mail::iconvert::begin(const std::string &src_chset, + const std::string &dst_chset) +{ + end(); + + if ((handle=libmail_u_convert_init(src_chset.c_str(), + dst_chset.c_str(), + &iconv_trampoline, + this)) == NULL) + return false; + return true; +} + +bool mail::iconvert::end(bool *errflag) +{ + int errptr; + + int rc; + + if (!handle) + return true; + + rc=libmail_u_convert_deinit(handle, &errptr); + handle=NULL; + + if (errflag) + *errflag=errptr != 0; + return rc == 0; +} + +bool mail::iconvert::operator()(const char *str, size_t cnt) +{ + if (!handle) + return false; + + return (libmail_u_convert(handle, str, cnt) == 0); +} + +bool mail::iconvert::operator()(const unicode_char *str, size_t cnt) +{ + if (!handle) + return false; + + return (libmail_u_convert_uc(handle, str, cnt) == 0); +} + +std::string mail::iconvert::convert(const std::string &text, + const std::string &charset, + const std::string &dstcharset, + bool &errflag) +{ + std::string buf; + int errptr; + + char *p=libmail_u_convert_tobuf(text.c_str(), + charset.c_str(), + dstcharset.c_str(), + &errptr); + + errflag= errptr != 0; + + try { + buf=p; + free(p); + } catch (...) { + free(p); + throw; + } + + return buf; +} + + +std::string mail::iconvert::convert(const std::vector<unicode_char> &uc, + const std::string &dstcharset, + bool &errflag) +{ + std::string buf; + + char *c; + size_t csize; + int err; + + if (libmail_u_convert_fromu_tobuf(&uc[0], uc.size(), + dstcharset.c_str(), &c, &csize, + &err)) + { + err=1; + } + else + { + if (csize) + --csize; // Trailing NULL + try { + buf.append(c, c+csize); + free(c); + } catch (...) + { + free(c); + throw; + } + } + + errflag= err != 0; + + return buf; +} + +bool mail::iconvert::convert(const std::string &text, + const std::string &charset, + std::vector<unicode_char> &uc) +{ + int err; + + unicode_char *ucbuf; + size_t ucsize; + + if (libmail_u_convert_tou_tobuf(text.c_str(), + text.size(), + charset.c_str(), + &ucbuf, + &ucsize, + &err)) + return false; + + try { + uc.clear(); + uc.reserve(ucsize); + uc.insert(uc.end(), ucbuf, ucbuf+ucsize); + free(ucbuf); + } catch (...) + { + free(ucbuf); + throw; + } + + return err == 0; +} + +int mail::iconvert::tou::converted(const unicode_char *, size_t) +{ + return 0; +} + +bool mail::iconvert::tou::begin(const std::string &chset) +{ + return iconvert::begin(chset, libmail_u_ucs4_native); +} + +int mail::iconvert::tou::converted(const char *ptr, size_t cnt) +{ + return converted(reinterpret_cast<const unicode_char *>(ptr), + cnt/sizeof(unicode_char)); +} + +void mail::iconvert::tou::convert(const std::string &str, + const std::string &chset, + std::vector<unicode_char> &out_buf) +{ + convert(str.begin(), str.end(), chset, out_buf); +} + +bool mail::iconvert::fromu::begin(const std::string &chset) +{ + return iconvert::begin(libmail_u_ucs4_native, chset); +} + +std::string mail::iconvert::fromu::convert(const std::vector<unicode_char> + &ubuf, + const std::string &chset) +{ + std::string s; + + convert(ubuf, chset, s); + return s; +} + +void mail::iconvert::fromu::convert(const std::vector<unicode_char> &ubuf, + const std::string &chset, + std::string &out_buf) +{ + convert(ubuf.begin(), ubuf.end(), chset, out_buf); +} + +std::string mail::iconvert::convert_tocase(const std::string &text, + const std::string &charset, + bool &err, + unicode_char (*first_char_func)(unicode_char), + unicode_char (*char_func)(unicode_char)) +{ + err=false; + std::string s; + + char *p=libmail_u_convert_tocase(text.c_str(), + charset.c_str(), + first_char_func, + char_func); + + if (!p) + { + err=true; + return s; + } + + try { + s=p; + free(p); + } catch (...) { + free(p); + throw; + } + return s; +} + +mail::linebreak_callback_base::linebreak_callback_base() + : handle(NULL), opts(0) +{ +} + + +void mail::linebreak_callback_base::set_opts(int optsArg) +{ + opts=optsArg; + + if (handle) + unicode_lb_set_opts(handle, opts); +} + +mail::linebreak_callback_base::~linebreak_callback_base() +{ + finish(); +} + +int mail::linebreak_callback_base::operator()(int) +{ + return 0; +} + +mail::linebreak_callback_base +&mail::linebreak_callback_base::operator<<(unicode_char uc) +{ + if (!handle) + { + handle=unicode_lb_init(linebreak_trampoline, + reinterpret_cast<void *> + (static_cast<linebreak_callback_base *> + (this))); + set_opts(opts); + } + + if (handle) + if (unicode_lb_next(handle, uc)) + finish(); + return *this; +} + +void mail::linebreak_callback_base::finish() +{ + if (handle) + unicode_lb_end(handle); + handle=NULL; +} + + +mail::linebreak_callback_save_buf::linebreak_callback_save_buf() +{ +} + +mail::linebreak_callback_save_buf::~linebreak_callback_save_buf() +{ +} + +int mail::linebreak_callback_save_buf::operator()(int value) +{ + lb_buf.push_back(value); + return 0; +} + +mail::linebreakc_callback_base::linebreakc_callback_base() + : handle(NULL), opts(0) +{ +} + +mail::linebreakc_callback_base::~linebreakc_callback_base() +{ + finish(); +} + +int mail::linebreakc_callback_base::operator()(int, unicode_char) +{ + return 0; +} + +void mail::linebreakc_callback_base::set_opts(int optsArg) +{ + opts=optsArg; + + if (handle) + unicode_lbc_set_opts(handle, opts); +} + +mail::linebreakc_callback_base +&mail::linebreakc_callback_base::operator<<(unicode_char uc) +{ + if (handle == NULL) + { + handle=unicode_lbc_init(linebreakc_trampoline, + reinterpret_cast<void *> + (static_cast<linebreakc_callback_base *> + (this))); + set_opts(opts); + } + + if (handle) + if (unicode_lbc_next(handle, uc)) + finish(); + return *this; +} + +void mail::linebreakc_callback_base::finish() +{ + if (handle) + unicode_lbc_end(handle); + handle=NULL; +} + + +mail::linebreakc_callback_save_buf::linebreakc_callback_save_buf() +{ +} + +mail::linebreakc_callback_save_buf::~linebreakc_callback_save_buf() +{ +} + +int mail::linebreakc_callback_save_buf::operator()(int c, unicode_char ch) +{ + lb_buf.push_back(std::make_pair(c, ch)); + return 0; +} + +mail::wordbreak_callback_base::wordbreak_callback_base() + : handle(NULL) +{ +} + +mail::wordbreak_callback_base::~wordbreak_callback_base() +{ + finish(); +} + +int mail::wordbreak_callback_base::operator()(bool) +{ + return 0; +} + +mail::wordbreak_callback_base +&mail::wordbreak_callback_base::operator<<(unicode_char uc) +{ + if (!handle) + { + handle=unicode_wb_init(wordbreak_trampoline, + reinterpret_cast<void *> + (static_cast<wordbreak_callback_base *> + (this))); + } + + if (handle) + if (unicode_wb_next(handle, uc)) + finish(); + return *this; +} + +void mail::wordbreak_callback_base::finish() +{ + if (handle) + unicode_wb_end(handle); + handle=NULL; +} + +/* -------------------------------------------- */ + +mail::wordbreakscan::wordbreakscan() : handle(NULL) +{ +} + +mail::wordbreakscan::~wordbreakscan() +{ + finish(); +} + +bool mail::wordbreakscan::operator<<(unicode_char uc) +{ + if (!handle) + handle=unicode_wbscan_init(); + + if (handle) + return unicode_wbscan_next(handle, uc) != 0; + + return false; +} + +size_t mail::wordbreakscan::finish() +{ + size_t n=0; + + if (handle) + { + n=unicode_wbscan_end(handle); + handle=NULL; + } + return n; +} diff --git a/unicode/unicodefilter.pl b/unicode/unicodefilter.pl new file mode 100644 index 0000000..a08c139 --- /dev/null +++ b/unicode/unicodefilter.pl @@ -0,0 +1,31 @@ + +my $unicodes=shift; +my $testing_hook=shift; + +my %unicodes; + +grep ( $unicodes{lc($_)}=1, split (/,/, $unicodes)); + +while (<STDIN>) +{ + if ($unicodes eq "" || $unicodes eq "yes") + { + print; + next; + } + +my ($chset, $structname)=split (/[ \t\r\n]/, $_); + + if ($unicodes eq "no") + { + next if $structname ne "unicode_ISO8859_1"; + } + else + { + next unless $unicodes{lc($chset)} + || $structname eq "unicode_ISO8859_1"; + } + print; +} + +print "X-TEST\tunicode_XTEST\n" if $testing_hook eq "yes"; diff --git a/unicode/unicodetest.c b/unicode/unicodetest.c new file mode 100644 index 0000000..0356624 --- /dev/null +++ b/unicode/unicodetest.c @@ -0,0 +1,206 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> + +struct collect_buf { + char *ptr; + size_t cnt; + size_t size; +}; + +static int save_output(const char *p, size_t n, void *ptr) +{ + struct collect_buf *cb=(struct collect_buf *)ptr; + + while (n) + { + if (cb->cnt < cb->size) + cb->ptr[cb->cnt++]=*p; + ++p; + --n; + } + return 0; +} + +static void test1() +{ + static const char teststr[]= { + 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x04, 0x14, + 0x00, 0x00, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x42}; + char outputbuf[12]; + struct collect_buf cb; + libmail_u_convert_handle_t h; + int checkflag; + + cb.ptr=outputbuf; + cb.cnt=0; + cb.size=sizeof(outputbuf); + + if ((h=libmail_u_convert_init("UCS-4BE", "ISO-8859-1", + save_output, &cb)) == NULL) + { + perror("libmail_u_convert_init"); + exit(1); + } + + libmail_u_convert(h, teststr, sizeof(teststr)); + + if (libmail_u_convert_deinit(h, &checkflag)) + { + perror("libmail_u_convert_deinit"); + exit(1); + } + if (cb.cnt != 2 || memcmp(cb.ptr, "AB", 2) || !checkflag) + { + fprintf(stderr, "Unexpected result from convert()\n"); + exit(1); + } +} + +static void test2() +{ + unicode_char *ucptr; + size_t ucsize; + libmail_u_convert_handle_t h= + libmail_u_convert_tou_init("utf-8", &ucptr, &ucsize, 1); + char *cptr; + size_t csize; + + if (h) + { + size_t i; + + for (i=0; i<1024/32; ++i) + libmail_u_convert(h, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + 32); + + if (libmail_u_convert_deinit(h, NULL) == 0 && + ucsize == 1024+1) + { + for (i=0; i<1024; i++) + if (ucptr[i] != 'A') + break; + + if (i == 1024) + { + h=libmail_u_convert_fromu_init("utf-8", + &cptr, &csize, + 1); + + if (h) + { + libmail_u_convert_uc(h, ucptr, 1024); + if (libmail_u_convert_deinit(h, NULL) + == 0 && csize == 1024+1) + { + for (i=0; i<1024; i++) + if (cptr[i] != 'A') + break; + + free(ucptr); + free(cptr); + if (i == 1024) + return; + } + } + } + } + fprintf(stderr, "test2: failed"); + errno=EINVAL; + } + perror("test2"); + exit(1); +} + +int main(int argc, char **argv) +{ + const char *chset=unicode_x_imap_modutf7; + int argn=1; + + if (argn < argc && strcmp(argv[argn], "--smap") == 0) + { + chset=unicode_x_imap_modutf7 " ./~:"; + ++argn; + } + + if (argn < argc && strcmp(argv[argn], "--totitle") == 0) + { + ++argn; + + if (argn < argc) + { + char *p=libmail_u_convert_tocase(argv[argn], + "utf-8", + unicode_tc, + unicode_lc); + + if (p) + { + printf("%s\n", p); + free(p); + exit(0); + } + } + exit(1); + } + + if (argn < argc) + { + int errflag; + char *p=libmail_u_convert_tobuf(argv[argn], + "utf-8", + chset, + &errflag); + char *q; + + if (!p) + { + perror("libmail_u_convert"); + exit(1); + } + + if (errflag) + { + fprintf(stderr, "Conversion error?\n"); + exit(1); + } + + q=libmail_u_convert_tobuf(p, chset, "utf-8", &errflag); + if (!q) + { + perror("libmail_u_convert"); + exit(1); + } + + if (errflag) + { + fprintf(stderr, "Conversion error?\n"); + exit(1); + } + if (strcmp(q, argv[argn])) + { + fprintf(stderr, "Round trip error\n"); + exit(1); + } + printf("%s\n", p); + free(p); + free(q); + } + else + { + test1(); + test2(); + } + return 0; +} diff --git a/unicode/update.sh b/unicode/update.sh new file mode 100644 index 0000000..2388639 --- /dev/null +++ b/unicode/update.sh @@ -0,0 +1,23 @@ + +filename="$1" +url="$2" + +tmpfilename="$filename.tmp" + +echo wget $url +wget -O - $url >$tmpfilename +if test ! -s $tmpfilename +then + rm -f $tmpfilename + exit 1 +fi + +if test -f $filename +then + if cmp -s $filename $tmpfilename + then + rm -f $tmpfilename + exit 0 + fi +fi +mv $tmpfilename $filename diff --git a/unicode/wordbreaktab.h b/unicode/wordbreaktab.h new file mode 100644 index 0000000..5e07d7a --- /dev/null +++ b/unicode/wordbreaktab.h @@ -0,0 +1,5083 @@ +static const uint8_t unicode_rangetab[][2]={ + {0x000a & 0xFF, 0x000a & 0xFF}, + {0x000b & 0xFF, 0x000c & 0xFF}, + {0x000d & 0xFF, 0x000d & 0xFF}, + {0x0027 & 0xFF, 0x0027 & 0xFF}, + {0x002c & 0xFF, 0x002c & 0xFF}, + {0x002e & 0xFF, 0x002e & 0xFF}, + {0x0030 & 0xFF, 0x0039 & 0xFF}, + {0x003a & 0xFF, 0x003a & 0xFF}, + {0x003b & 0xFF, 0x003b & 0xFF}, + {0x0041 & 0xFF, 0x005a & 0xFF}, + {0x005f & 0xFF, 0x005f & 0xFF}, + {0x0061 & 0xFF, 0x007a & 0xFF}, + {0x0085 & 0xFF, 0x0085 & 0xFF}, + {0x00aa & 0xFF, 0x00aa & 0xFF}, + {0x00ad & 0xFF, 0x00ad & 0xFF}, + {0x00b5 & 0xFF, 0x00b5 & 0xFF}, + {0x00b7 & 0xFF, 0x00b7 & 0xFF}, + {0x00ba & 0xFF, 0x00ba & 0xFF}, + {0x00c0 & 0xFF, 0x00d6 & 0xFF}, + {0x00d8 & 0xFF, 0x00f6 & 0xFF}, + {0x00f8 & 0xFF, 0x00ff & 0xFF}, + {0x0100 & 0xFF, 0x01ff & 0xFF}, + {0x0200 & 0xFF, 0x02c1 & 0xFF}, + {0x02c6 & 0xFF, 0x02d1 & 0xFF}, + {0x02e0 & 0xFF, 0x02e4 & 0xFF}, + {0x02ec & 0xFF, 0x02ec & 0xFF}, + {0x02ee & 0xFF, 0x02ee & 0xFF}, + {0x0300 & 0xFF, 0x036f & 0xFF}, + {0x0370 & 0xFF, 0x0374 & 0xFF}, + {0x0376 & 0xFF, 0x0377 & 0xFF}, + {0x037a & 0xFF, 0x037d & 0xFF}, + {0x037e & 0xFF, 0x037e & 0xFF}, + {0x0386 & 0xFF, 0x0386 & 0xFF}, + {0x0387 & 0xFF, 0x0387 & 0xFF}, + {0x0388 & 0xFF, 0x038a & 0xFF}, + {0x038c & 0xFF, 0x038c & 0xFF}, + {0x038e & 0xFF, 0x03a1 & 0xFF}, + {0x03a3 & 0xFF, 0x03f5 & 0xFF}, + {0x03f7 & 0xFF, 0x03ff & 0xFF}, + {0x0400 & 0xFF, 0x0481 & 0xFF}, + {0x0483 & 0xFF, 0x0489 & 0xFF}, + {0x048a & 0xFF, 0x04ff & 0xFF}, + {0x0500 & 0xFF, 0x0527 & 0xFF}, + {0x0531 & 0xFF, 0x0556 & 0xFF}, + {0x0559 & 0xFF, 0x0559 & 0xFF}, + {0x0561 & 0xFF, 0x0587 & 0xFF}, + {0x0589 & 0xFF, 0x0589 & 0xFF}, + {0x0591 & 0xFF, 0x05bd & 0xFF}, + {0x05bf & 0xFF, 0x05bf & 0xFF}, + {0x05c1 & 0xFF, 0x05c2 & 0xFF}, + {0x05c4 & 0xFF, 0x05c5 & 0xFF}, + {0x05c7 & 0xFF, 0x05c7 & 0xFF}, + {0x05d0 & 0xFF, 0x05ea & 0xFF}, + {0x05f0 & 0xFF, 0x05f3 & 0xFF}, + {0x05f4 & 0xFF, 0x05f4 & 0xFF}, + {0x0600 & 0xFF, 0x0603 & 0xFF}, + {0x060c & 0xFF, 0x060d & 0xFF}, + {0x0610 & 0xFF, 0x061a & 0xFF}, + {0x0620 & 0xFF, 0x064a & 0xFF}, + {0x064b & 0xFF, 0x065f & 0xFF}, + {0x0660 & 0xFF, 0x0669 & 0xFF}, + {0x066b & 0xFF, 0x066b & 0xFF}, + {0x066c & 0xFF, 0x066c & 0xFF}, + {0x066e & 0xFF, 0x066f & 0xFF}, + {0x0670 & 0xFF, 0x0670 & 0xFF}, + {0x0671 & 0xFF, 0x06d3 & 0xFF}, + {0x06d5 & 0xFF, 0x06d5 & 0xFF}, + {0x06d6 & 0xFF, 0x06dc & 0xFF}, + {0x06dd & 0xFF, 0x06dd & 0xFF}, + {0x06df & 0xFF, 0x06e4 & 0xFF}, + {0x06e5 & 0xFF, 0x06e6 & 0xFF}, + {0x06e7 & 0xFF, 0x06e8 & 0xFF}, + {0x06ea & 0xFF, 0x06ed & 0xFF}, + {0x06ee & 0xFF, 0x06ef & 0xFF}, + {0x06f0 & 0xFF, 0x06f9 & 0xFF}, + {0x06fa & 0xFF, 0x06fc & 0xFF}, + {0x06ff & 0xFF, 0x06ff & 0xFF}, + {0x070f & 0xFF, 0x070f & 0xFF}, + {0x0710 & 0xFF, 0x0710 & 0xFF}, + {0x0711 & 0xFF, 0x0711 & 0xFF}, + {0x0712 & 0xFF, 0x072f & 0xFF}, + {0x0730 & 0xFF, 0x074a & 0xFF}, + {0x074d & 0xFF, 0x07a5 & 0xFF}, + {0x07a6 & 0xFF, 0x07b0 & 0xFF}, + {0x07b1 & 0xFF, 0x07b1 & 0xFF}, + {0x07c0 & 0xFF, 0x07c9 & 0xFF}, + {0x07ca & 0xFF, 0x07ea & 0xFF}, + {0x07eb & 0xFF, 0x07f3 & 0xFF}, + {0x07f4 & 0xFF, 0x07f5 & 0xFF}, + {0x07f8 & 0xFF, 0x07f8 & 0xFF}, + {0x07fa & 0xFF, 0x07fa & 0xFF}, + {0x0800 & 0xFF, 0x0815 & 0xFF}, + {0x0816 & 0xFF, 0x0819 & 0xFF}, + {0x081a & 0xFF, 0x081a & 0xFF}, + {0x081b & 0xFF, 0x0823 & 0xFF}, + {0x0824 & 0xFF, 0x0824 & 0xFF}, + {0x0825 & 0xFF, 0x0827 & 0xFF}, + {0x0828 & 0xFF, 0x0828 & 0xFF}, + {0x0829 & 0xFF, 0x082d & 0xFF}, + {0x0840 & 0xFF, 0x0858 & 0xFF}, + {0x0859 & 0xFF, 0x085b & 0xFF}, + {0x0900 & 0xFF, 0x0903 & 0xFF}, + {0x0904 & 0xFF, 0x0939 & 0xFF}, + {0x093a & 0xFF, 0x093c & 0xFF}, + {0x093d & 0xFF, 0x093d & 0xFF}, + {0x093e & 0xFF, 0x094f & 0xFF}, + {0x0950 & 0xFF, 0x0950 & 0xFF}, + {0x0951 & 0xFF, 0x0957 & 0xFF}, + {0x0958 & 0xFF, 0x0961 & 0xFF}, + {0x0962 & 0xFF, 0x0963 & 0xFF}, + {0x0966 & 0xFF, 0x096f & 0xFF}, + {0x0971 & 0xFF, 0x0977 & 0xFF}, + {0x0979 & 0xFF, 0x097f & 0xFF}, + {0x0981 & 0xFF, 0x0983 & 0xFF}, + {0x0985 & 0xFF, 0x098c & 0xFF}, + {0x098f & 0xFF, 0x0990 & 0xFF}, + {0x0993 & 0xFF, 0x09a8 & 0xFF}, + {0x09aa & 0xFF, 0x09b0 & 0xFF}, + {0x09b2 & 0xFF, 0x09b2 & 0xFF}, + {0x09b6 & 0xFF, 0x09b9 & 0xFF}, + {0x09bc & 0xFF, 0x09bc & 0xFF}, + {0x09bd & 0xFF, 0x09bd & 0xFF}, + {0x09be & 0xFF, 0x09c4 & 0xFF}, + {0x09c7 & 0xFF, 0x09c8 & 0xFF}, + {0x09cb & 0xFF, 0x09cd & 0xFF}, + {0x09ce & 0xFF, 0x09ce & 0xFF}, + {0x09d7 & 0xFF, 0x09d7 & 0xFF}, + {0x09dc & 0xFF, 0x09dd & 0xFF}, + {0x09df & 0xFF, 0x09e1 & 0xFF}, + {0x09e2 & 0xFF, 0x09e3 & 0xFF}, + {0x09e6 & 0xFF, 0x09ef & 0xFF}, + {0x09f0 & 0xFF, 0x09f1 & 0xFF}, + {0x0a01 & 0xFF, 0x0a03 & 0xFF}, + {0x0a05 & 0xFF, 0x0a0a & 0xFF}, + {0x0a0f & 0xFF, 0x0a10 & 0xFF}, + {0x0a13 & 0xFF, 0x0a28 & 0xFF}, + {0x0a2a & 0xFF, 0x0a30 & 0xFF}, + {0x0a32 & 0xFF, 0x0a33 & 0xFF}, + {0x0a35 & 0xFF, 0x0a36 & 0xFF}, + {0x0a38 & 0xFF, 0x0a39 & 0xFF}, + {0x0a3c & 0xFF, 0x0a3c & 0xFF}, + {0x0a3e & 0xFF, 0x0a42 & 0xFF}, + {0x0a47 & 0xFF, 0x0a48 & 0xFF}, + {0x0a4b & 0xFF, 0x0a4d & 0xFF}, + {0x0a51 & 0xFF, 0x0a51 & 0xFF}, + {0x0a59 & 0xFF, 0x0a5c & 0xFF}, + {0x0a5e & 0xFF, 0x0a5e & 0xFF}, + {0x0a66 & 0xFF, 0x0a6f & 0xFF}, + {0x0a70 & 0xFF, 0x0a71 & 0xFF}, + {0x0a72 & 0xFF, 0x0a74 & 0xFF}, + {0x0a75 & 0xFF, 0x0a75 & 0xFF}, + {0x0a81 & 0xFF, 0x0a83 & 0xFF}, + {0x0a85 & 0xFF, 0x0a8d & 0xFF}, + {0x0a8f & 0xFF, 0x0a91 & 0xFF}, + {0x0a93 & 0xFF, 0x0aa8 & 0xFF}, + {0x0aaa & 0xFF, 0x0ab0 & 0xFF}, + {0x0ab2 & 0xFF, 0x0ab3 & 0xFF}, + {0x0ab5 & 0xFF, 0x0ab9 & 0xFF}, + {0x0abc & 0xFF, 0x0abc & 0xFF}, + {0x0abd & 0xFF, 0x0abd & 0xFF}, + {0x0abe & 0xFF, 0x0ac5 & 0xFF}, + {0x0ac7 & 0xFF, 0x0ac9 & 0xFF}, + {0x0acb & 0xFF, 0x0acd & 0xFF}, + {0x0ad0 & 0xFF, 0x0ad0 & 0xFF}, + {0x0ae0 & 0xFF, 0x0ae1 & 0xFF}, + {0x0ae2 & 0xFF, 0x0ae3 & 0xFF}, + {0x0ae6 & 0xFF, 0x0aef & 0xFF}, + {0x0b01 & 0xFF, 0x0b03 & 0xFF}, + {0x0b05 & 0xFF, 0x0b0c & 0xFF}, + {0x0b0f & 0xFF, 0x0b10 & 0xFF}, + {0x0b13 & 0xFF, 0x0b28 & 0xFF}, + {0x0b2a & 0xFF, 0x0b30 & 0xFF}, + {0x0b32 & 0xFF, 0x0b33 & 0xFF}, + {0x0b35 & 0xFF, 0x0b39 & 0xFF}, + {0x0b3c & 0xFF, 0x0b3c & 0xFF}, + {0x0b3d & 0xFF, 0x0b3d & 0xFF}, + {0x0b3e & 0xFF, 0x0b44 & 0xFF}, + {0x0b47 & 0xFF, 0x0b48 & 0xFF}, + {0x0b4b & 0xFF, 0x0b4d & 0xFF}, + {0x0b56 & 0xFF, 0x0b57 & 0xFF}, + {0x0b5c & 0xFF, 0x0b5d & 0xFF}, + {0x0b5f & 0xFF, 0x0b61 & 0xFF}, + {0x0b62 & 0xFF, 0x0b63 & 0xFF}, + {0x0b66 & 0xFF, 0x0b6f & 0xFF}, + {0x0b71 & 0xFF, 0x0b71 & 0xFF}, + {0x0b82 & 0xFF, 0x0b82 & 0xFF}, + {0x0b83 & 0xFF, 0x0b83 & 0xFF}, + {0x0b85 & 0xFF, 0x0b8a & 0xFF}, + {0x0b8e & 0xFF, 0x0b90 & 0xFF}, + {0x0b92 & 0xFF, 0x0b95 & 0xFF}, + {0x0b99 & 0xFF, 0x0b9a & 0xFF}, + {0x0b9c & 0xFF, 0x0b9c & 0xFF}, + {0x0b9e & 0xFF, 0x0b9f & 0xFF}, + {0x0ba3 & 0xFF, 0x0ba4 & 0xFF}, + {0x0ba8 & 0xFF, 0x0baa & 0xFF}, + {0x0bae & 0xFF, 0x0bb9 & 0xFF}, + {0x0bbe & 0xFF, 0x0bc2 & 0xFF}, + {0x0bc6 & 0xFF, 0x0bc8 & 0xFF}, + {0x0bca & 0xFF, 0x0bcd & 0xFF}, + {0x0bd0 & 0xFF, 0x0bd0 & 0xFF}, + {0x0bd7 & 0xFF, 0x0bd7 & 0xFF}, + {0x0be6 & 0xFF, 0x0bef & 0xFF}, + {0x0c01 & 0xFF, 0x0c03 & 0xFF}, + {0x0c05 & 0xFF, 0x0c0c & 0xFF}, + {0x0c0e & 0xFF, 0x0c10 & 0xFF}, + {0x0c12 & 0xFF, 0x0c28 & 0xFF}, + {0x0c2a & 0xFF, 0x0c33 & 0xFF}, + {0x0c35 & 0xFF, 0x0c39 & 0xFF}, + {0x0c3d & 0xFF, 0x0c3d & 0xFF}, + {0x0c3e & 0xFF, 0x0c44 & 0xFF}, + {0x0c46 & 0xFF, 0x0c48 & 0xFF}, + {0x0c4a & 0xFF, 0x0c4d & 0xFF}, + {0x0c55 & 0xFF, 0x0c56 & 0xFF}, + {0x0c58 & 0xFF, 0x0c59 & 0xFF}, + {0x0c60 & 0xFF, 0x0c61 & 0xFF}, + {0x0c62 & 0xFF, 0x0c63 & 0xFF}, + {0x0c66 & 0xFF, 0x0c6f & 0xFF}, + {0x0c82 & 0xFF, 0x0c83 & 0xFF}, + {0x0c85 & 0xFF, 0x0c8c & 0xFF}, + {0x0c8e & 0xFF, 0x0c90 & 0xFF}, + {0x0c92 & 0xFF, 0x0ca8 & 0xFF}, + {0x0caa & 0xFF, 0x0cb3 & 0xFF}, + {0x0cb5 & 0xFF, 0x0cb9 & 0xFF}, + {0x0cbc & 0xFF, 0x0cbc & 0xFF}, + {0x0cbd & 0xFF, 0x0cbd & 0xFF}, + {0x0cbe & 0xFF, 0x0cc4 & 0xFF}, + {0x0cc6 & 0xFF, 0x0cc8 & 0xFF}, + {0x0cca & 0xFF, 0x0ccd & 0xFF}, + {0x0cd5 & 0xFF, 0x0cd6 & 0xFF}, + {0x0cde & 0xFF, 0x0cde & 0xFF}, + {0x0ce0 & 0xFF, 0x0ce1 & 0xFF}, + {0x0ce2 & 0xFF, 0x0ce3 & 0xFF}, + {0x0ce6 & 0xFF, 0x0cef & 0xFF}, + {0x0cf1 & 0xFF, 0x0cf2 & 0xFF}, + {0x0d02 & 0xFF, 0x0d03 & 0xFF}, + {0x0d05 & 0xFF, 0x0d0c & 0xFF}, + {0x0d0e & 0xFF, 0x0d10 & 0xFF}, + {0x0d12 & 0xFF, 0x0d3a & 0xFF}, + {0x0d3d & 0xFF, 0x0d3d & 0xFF}, + {0x0d3e & 0xFF, 0x0d44 & 0xFF}, + {0x0d46 & 0xFF, 0x0d48 & 0xFF}, + {0x0d4a & 0xFF, 0x0d4d & 0xFF}, + {0x0d4e & 0xFF, 0x0d4e & 0xFF}, + {0x0d57 & 0xFF, 0x0d57 & 0xFF}, + {0x0d60 & 0xFF, 0x0d61 & 0xFF}, + {0x0d62 & 0xFF, 0x0d63 & 0xFF}, + {0x0d66 & 0xFF, 0x0d6f & 0xFF}, + {0x0d7a & 0xFF, 0x0d7f & 0xFF}, + {0x0d82 & 0xFF, 0x0d83 & 0xFF}, + {0x0d85 & 0xFF, 0x0d96 & 0xFF}, + {0x0d9a & 0xFF, 0x0db1 & 0xFF}, + {0x0db3 & 0xFF, 0x0dbb & 0xFF}, + {0x0dbd & 0xFF, 0x0dbd & 0xFF}, + {0x0dc0 & 0xFF, 0x0dc6 & 0xFF}, + {0x0dca & 0xFF, 0x0dca & 0xFF}, + {0x0dcf & 0xFF, 0x0dd4 & 0xFF}, + {0x0dd6 & 0xFF, 0x0dd6 & 0xFF}, + {0x0dd8 & 0xFF, 0x0ddf & 0xFF}, + {0x0df2 & 0xFF, 0x0df3 & 0xFF}, + {0x0e31 & 0xFF, 0x0e31 & 0xFF}, + {0x0e34 & 0xFF, 0x0e3a & 0xFF}, + {0x0e47 & 0xFF, 0x0e4e & 0xFF}, + {0x0e50 & 0xFF, 0x0e59 & 0xFF}, + {0x0eb1 & 0xFF, 0x0eb1 & 0xFF}, + {0x0eb4 & 0xFF, 0x0eb9 & 0xFF}, + {0x0ebb & 0xFF, 0x0ebc & 0xFF}, + {0x0ec8 & 0xFF, 0x0ecd & 0xFF}, + {0x0ed0 & 0xFF, 0x0ed9 & 0xFF}, + {0x0f00 & 0xFF, 0x0f00 & 0xFF}, + {0x0f18 & 0xFF, 0x0f19 & 0xFF}, + {0x0f20 & 0xFF, 0x0f29 & 0xFF}, + {0x0f35 & 0xFF, 0x0f35 & 0xFF}, + {0x0f37 & 0xFF, 0x0f37 & 0xFF}, + {0x0f39 & 0xFF, 0x0f39 & 0xFF}, + {0x0f3e & 0xFF, 0x0f3f & 0xFF}, + {0x0f40 & 0xFF, 0x0f47 & 0xFF}, + {0x0f49 & 0xFF, 0x0f6c & 0xFF}, + {0x0f71 & 0xFF, 0x0f84 & 0xFF}, + {0x0f86 & 0xFF, 0x0f87 & 0xFF}, + {0x0f88 & 0xFF, 0x0f8c & 0xFF}, + {0x0f8d & 0xFF, 0x0f97 & 0xFF}, + {0x0f99 & 0xFF, 0x0fbc & 0xFF}, + {0x0fc6 & 0xFF, 0x0fc6 & 0xFF}, + {0x102b & 0xFF, 0x103e & 0xFF}, + {0x1040 & 0xFF, 0x1049 & 0xFF}, + {0x1056 & 0xFF, 0x1059 & 0xFF}, + {0x105e & 0xFF, 0x1060 & 0xFF}, + {0x1062 & 0xFF, 0x1064 & 0xFF}, + {0x1067 & 0xFF, 0x106d & 0xFF}, + {0x1071 & 0xFF, 0x1074 & 0xFF}, + {0x1082 & 0xFF, 0x108d & 0xFF}, + {0x108f & 0xFF, 0x108f & 0xFF}, + {0x1090 & 0xFF, 0x1099 & 0xFF}, + {0x109a & 0xFF, 0x109d & 0xFF}, + {0x10a0 & 0xFF, 0x10c5 & 0xFF}, + {0x10d0 & 0xFF, 0x10fa & 0xFF}, + {0x10fc & 0xFF, 0x10fc & 0xFF}, + {0x1100 & 0xFF, 0x11ff & 0xFF}, + {0x1200 & 0xFF, 0x1248 & 0xFF}, + {0x124a & 0xFF, 0x124d & 0xFF}, + {0x1250 & 0xFF, 0x1256 & 0xFF}, + {0x1258 & 0xFF, 0x1258 & 0xFF}, + {0x125a & 0xFF, 0x125d & 0xFF}, + {0x1260 & 0xFF, 0x1288 & 0xFF}, + {0x128a & 0xFF, 0x128d & 0xFF}, + {0x1290 & 0xFF, 0x12b0 & 0xFF}, + {0x12b2 & 0xFF, 0x12b5 & 0xFF}, + {0x12b8 & 0xFF, 0x12be & 0xFF}, + {0x12c0 & 0xFF, 0x12c0 & 0xFF}, + {0x12c2 & 0xFF, 0x12c5 & 0xFF}, + {0x12c8 & 0xFF, 0x12d6 & 0xFF}, + {0x12d8 & 0xFF, 0x12ff & 0xFF}, + {0x1300 & 0xFF, 0x1310 & 0xFF}, + {0x1312 & 0xFF, 0x1315 & 0xFF}, + {0x1318 & 0xFF, 0x135a & 0xFF}, + {0x135d & 0xFF, 0x135f & 0xFF}, + {0x1380 & 0xFF, 0x138f & 0xFF}, + {0x13a0 & 0xFF, 0x13f4 & 0xFF}, + {0x1401 & 0xFF, 0x14ff & 0xFF}, + {0x1500 & 0xFF, 0x15ff & 0xFF}, + {0x1600 & 0xFF, 0x166c & 0xFF}, + {0x166f & 0xFF, 0x167f & 0xFF}, + {0x1681 & 0xFF, 0x169a & 0xFF}, + {0x16a0 & 0xFF, 0x16ea & 0xFF}, + {0x16ee & 0xFF, 0x16f0 & 0xFF}, + {0x1700 & 0xFF, 0x170c & 0xFF}, + {0x170e & 0xFF, 0x1711 & 0xFF}, + {0x1712 & 0xFF, 0x1714 & 0xFF}, + {0x1720 & 0xFF, 0x1731 & 0xFF}, + {0x1732 & 0xFF, 0x1734 & 0xFF}, + {0x1740 & 0xFF, 0x1751 & 0xFF}, + {0x1752 & 0xFF, 0x1753 & 0xFF}, + {0x1760 & 0xFF, 0x176c & 0xFF}, + {0x176e & 0xFF, 0x1770 & 0xFF}, + {0x1772 & 0xFF, 0x1773 & 0xFF}, + {0x17b4 & 0xFF, 0x17b5 & 0xFF}, + {0x17b6 & 0xFF, 0x17d3 & 0xFF}, + {0x17dd & 0xFF, 0x17dd & 0xFF}, + {0x17e0 & 0xFF, 0x17e9 & 0xFF}, + {0x180b & 0xFF, 0x180d & 0xFF}, + {0x1810 & 0xFF, 0x1819 & 0xFF}, + {0x1820 & 0xFF, 0x1877 & 0xFF}, + {0x1880 & 0xFF, 0x18a8 & 0xFF}, + {0x18a9 & 0xFF, 0x18a9 & 0xFF}, + {0x18aa & 0xFF, 0x18aa & 0xFF}, + {0x18b0 & 0xFF, 0x18f5 & 0xFF}, + {0x1900 & 0xFF, 0x191c & 0xFF}, + {0x1920 & 0xFF, 0x192b & 0xFF}, + {0x1930 & 0xFF, 0x193b & 0xFF}, + {0x1946 & 0xFF, 0x194f & 0xFF}, + {0x19b0 & 0xFF, 0x19c0 & 0xFF}, + {0x19c8 & 0xFF, 0x19c9 & 0xFF}, + {0x19d0 & 0xFF, 0x19d9 & 0xFF}, + {0x1a00 & 0xFF, 0x1a16 & 0xFF}, + {0x1a17 & 0xFF, 0x1a1b & 0xFF}, + {0x1a55 & 0xFF, 0x1a5e & 0xFF}, + {0x1a60 & 0xFF, 0x1a7c & 0xFF}, + {0x1a7f & 0xFF, 0x1a7f & 0xFF}, + {0x1a80 & 0xFF, 0x1a89 & 0xFF}, + {0x1a90 & 0xFF, 0x1a99 & 0xFF}, + {0x1b00 & 0xFF, 0x1b04 & 0xFF}, + {0x1b05 & 0xFF, 0x1b33 & 0xFF}, + {0x1b34 & 0xFF, 0x1b44 & 0xFF}, + {0x1b45 & 0xFF, 0x1b4b & 0xFF}, + {0x1b50 & 0xFF, 0x1b59 & 0xFF}, + {0x1b6b & 0xFF, 0x1b73 & 0xFF}, + {0x1b80 & 0xFF, 0x1b82 & 0xFF}, + {0x1b83 & 0xFF, 0x1ba0 & 0xFF}, + {0x1ba1 & 0xFF, 0x1baa & 0xFF}, + {0x1bae & 0xFF, 0x1baf & 0xFF}, + {0x1bb0 & 0xFF, 0x1bb9 & 0xFF}, + {0x1bc0 & 0xFF, 0x1be5 & 0xFF}, + {0x1be6 & 0xFF, 0x1bf3 & 0xFF}, + {0x1c00 & 0xFF, 0x1c23 & 0xFF}, + {0x1c24 & 0xFF, 0x1c37 & 0xFF}, + {0x1c40 & 0xFF, 0x1c49 & 0xFF}, + {0x1c4d & 0xFF, 0x1c4f & 0xFF}, + {0x1c50 & 0xFF, 0x1c59 & 0xFF}, + {0x1c5a & 0xFF, 0x1c7d & 0xFF}, + {0x1cd0 & 0xFF, 0x1cd2 & 0xFF}, + {0x1cd4 & 0xFF, 0x1ce8 & 0xFF}, + {0x1ce9 & 0xFF, 0x1cec & 0xFF}, + {0x1ced & 0xFF, 0x1ced & 0xFF}, + {0x1cee & 0xFF, 0x1cf1 & 0xFF}, + {0x1cf2 & 0xFF, 0x1cf2 & 0xFF}, + {0x1d00 & 0xFF, 0x1dbf & 0xFF}, + {0x1dc0 & 0xFF, 0x1de6 & 0xFF}, + {0x1dfc & 0xFF, 0x1dff & 0xFF}, + {0x1e00 & 0xFF, 0x1eff & 0xFF}, + {0x1f00 & 0xFF, 0x1f15 & 0xFF}, + {0x1f18 & 0xFF, 0x1f1d & 0xFF}, + {0x1f20 & 0xFF, 0x1f45 & 0xFF}, + {0x1f48 & 0xFF, 0x1f4d & 0xFF}, + {0x1f50 & 0xFF, 0x1f57 & 0xFF}, + {0x1f59 & 0xFF, 0x1f59 & 0xFF}, + {0x1f5b & 0xFF, 0x1f5b & 0xFF}, + {0x1f5d & 0xFF, 0x1f5d & 0xFF}, + {0x1f5f & 0xFF, 0x1f7d & 0xFF}, + {0x1f80 & 0xFF, 0x1fb4 & 0xFF}, + {0x1fb6 & 0xFF, 0x1fbc & 0xFF}, + {0x1fbe & 0xFF, 0x1fbe & 0xFF}, + {0x1fc2 & 0xFF, 0x1fc4 & 0xFF}, + {0x1fc6 & 0xFF, 0x1fcc & 0xFF}, + {0x1fd0 & 0xFF, 0x1fd3 & 0xFF}, + {0x1fd6 & 0xFF, 0x1fdb & 0xFF}, + {0x1fe0 & 0xFF, 0x1fec & 0xFF}, + {0x1ff2 & 0xFF, 0x1ff4 & 0xFF}, + {0x1ff6 & 0xFF, 0x1ffc & 0xFF}, + {0x200c & 0xFF, 0x200d & 0xFF}, + {0x200e & 0xFF, 0x200f & 0xFF}, + {0x2018 & 0xFF, 0x2019 & 0xFF}, + {0x2024 & 0xFF, 0x2024 & 0xFF}, + {0x2027 & 0xFF, 0x2027 & 0xFF}, + {0x2028 & 0xFF, 0x2029 & 0xFF}, + {0x202a & 0xFF, 0x202e & 0xFF}, + {0x203f & 0xFF, 0x2040 & 0xFF}, + {0x2044 & 0xFF, 0x2044 & 0xFF}, + {0x2054 & 0xFF, 0x2054 & 0xFF}, + {0x2060 & 0xFF, 0x2064 & 0xFF}, + {0x206a & 0xFF, 0x206f & 0xFF}, + {0x2071 & 0xFF, 0x2071 & 0xFF}, + {0x207f & 0xFF, 0x207f & 0xFF}, + {0x2090 & 0xFF, 0x209c & 0xFF}, + {0x20d0 & 0xFF, 0x20f0 & 0xFF}, + {0x2102 & 0xFF, 0x2102 & 0xFF}, + {0x2107 & 0xFF, 0x2107 & 0xFF}, + {0x210a & 0xFF, 0x2113 & 0xFF}, + {0x2115 & 0xFF, 0x2115 & 0xFF}, + {0x2119 & 0xFF, 0x211d & 0xFF}, + {0x2124 & 0xFF, 0x2124 & 0xFF}, + {0x2126 & 0xFF, 0x2126 & 0xFF}, + {0x2128 & 0xFF, 0x2128 & 0xFF}, + {0x212a & 0xFF, 0x212d & 0xFF}, + {0x212f & 0xFF, 0x2139 & 0xFF}, + {0x213c & 0xFF, 0x213f & 0xFF}, + {0x2145 & 0xFF, 0x2149 & 0xFF}, + {0x214e & 0xFF, 0x214e & 0xFF}, + {0x2160 & 0xFF, 0x2188 & 0xFF}, + {0x24b6 & 0xFF, 0x24e9 & 0xFF}, + {0x2c00 & 0xFF, 0x2c2e & 0xFF}, + {0x2c30 & 0xFF, 0x2c5e & 0xFF}, + {0x2c60 & 0xFF, 0x2ce4 & 0xFF}, + {0x2ceb & 0xFF, 0x2cee & 0xFF}, + {0x2cef & 0xFF, 0x2cf1 & 0xFF}, + {0x2d00 & 0xFF, 0x2d25 & 0xFF}, + {0x2d30 & 0xFF, 0x2d65 & 0xFF}, + {0x2d6f & 0xFF, 0x2d6f & 0xFF}, + {0x2d7f & 0xFF, 0x2d7f & 0xFF}, + {0x2d80 & 0xFF, 0x2d96 & 0xFF}, + {0x2da0 & 0xFF, 0x2da6 & 0xFF}, + {0x2da8 & 0xFF, 0x2dae & 0xFF}, + {0x2db0 & 0xFF, 0x2db6 & 0xFF}, + {0x2db8 & 0xFF, 0x2dbe & 0xFF}, + {0x2dc0 & 0xFF, 0x2dc6 & 0xFF}, + {0x2dc8 & 0xFF, 0x2dce & 0xFF}, + {0x2dd0 & 0xFF, 0x2dd6 & 0xFF}, + {0x2dd8 & 0xFF, 0x2dde & 0xFF}, + {0x2de0 & 0xFF, 0x2dff & 0xFF}, + {0x2e2f & 0xFF, 0x2e2f & 0xFF}, + {0x3005 & 0xFF, 0x3005 & 0xFF}, + {0x302a & 0xFF, 0x302f & 0xFF}, + {0x3031 & 0xFF, 0x3035 & 0xFF}, + {0x303b & 0xFF, 0x303c & 0xFF}, + {0x3099 & 0xFF, 0x309a & 0xFF}, + {0x309b & 0xFF, 0x309c & 0xFF}, + {0x30a0 & 0xFF, 0x30fa & 0xFF}, + {0x30fc & 0xFF, 0x30ff & 0xFF}, + {0x3105 & 0xFF, 0x312d & 0xFF}, + {0x3131 & 0xFF, 0x318e & 0xFF}, + {0x31a0 & 0xFF, 0x31ba & 0xFF}, + {0x31f0 & 0xFF, 0x31ff & 0xFF}, + {0x32d0 & 0xFF, 0x32fe & 0xFF}, + {0x3300 & 0xFF, 0x3357 & 0xFF}, + {0xa000 & 0xFF, 0xa0ff & 0xFF}, + {0xa100 & 0xFF, 0xa1ff & 0xFF}, + {0xa200 & 0xFF, 0xa2ff & 0xFF}, + {0xa300 & 0xFF, 0xa3ff & 0xFF}, + {0xa400 & 0xFF, 0xa48c & 0xFF}, + {0xa4d0 & 0xFF, 0xa4fd & 0xFF}, + {0xa500 & 0xFF, 0xa5ff & 0xFF}, + {0xa600 & 0xFF, 0xa60c & 0xFF}, + {0xa610 & 0xFF, 0xa61f & 0xFF}, + {0xa620 & 0xFF, 0xa629 & 0xFF}, + {0xa62a & 0xFF, 0xa62b & 0xFF}, + {0xa640 & 0xFF, 0xa66e & 0xFF}, + {0xa66f & 0xFF, 0xa672 & 0xFF}, + {0xa67c & 0xFF, 0xa67d & 0xFF}, + {0xa67f & 0xFF, 0xa697 & 0xFF}, + {0xa6a0 & 0xFF, 0xa6ef & 0xFF}, + {0xa6f0 & 0xFF, 0xa6f1 & 0xFF}, + {0xa717 & 0xFF, 0xa71f & 0xFF}, + {0xa722 & 0xFF, 0xa788 & 0xFF}, + {0xa78b & 0xFF, 0xa78e & 0xFF}, + {0xa790 & 0xFF, 0xa791 & 0xFF}, + {0xa7a0 & 0xFF, 0xa7a9 & 0xFF}, + {0xa7fa & 0xFF, 0xa7ff & 0xFF}, + {0xa800 & 0xFF, 0xa801 & 0xFF}, + {0xa802 & 0xFF, 0xa802 & 0xFF}, + {0xa803 & 0xFF, 0xa805 & 0xFF}, + {0xa806 & 0xFF, 0xa806 & 0xFF}, + {0xa807 & 0xFF, 0xa80a & 0xFF}, + {0xa80b & 0xFF, 0xa80b & 0xFF}, + {0xa80c & 0xFF, 0xa822 & 0xFF}, + {0xa823 & 0xFF, 0xa827 & 0xFF}, + {0xa840 & 0xFF, 0xa873 & 0xFF}, + {0xa880 & 0xFF, 0xa881 & 0xFF}, + {0xa882 & 0xFF, 0xa8b3 & 0xFF}, + {0xa8b4 & 0xFF, 0xa8c4 & 0xFF}, + {0xa8d0 & 0xFF, 0xa8d9 & 0xFF}, + {0xa8e0 & 0xFF, 0xa8f1 & 0xFF}, + {0xa8f2 & 0xFF, 0xa8f7 & 0xFF}, + {0xa8fb & 0xFF, 0xa8fb & 0xFF}, + {0xa900 & 0xFF, 0xa909 & 0xFF}, + {0xa90a & 0xFF, 0xa925 & 0xFF}, + {0xa926 & 0xFF, 0xa92d & 0xFF}, + {0xa930 & 0xFF, 0xa946 & 0xFF}, + {0xa947 & 0xFF, 0xa953 & 0xFF}, + {0xa960 & 0xFF, 0xa97c & 0xFF}, + {0xa980 & 0xFF, 0xa983 & 0xFF}, + {0xa984 & 0xFF, 0xa9b2 & 0xFF}, + {0xa9b3 & 0xFF, 0xa9c0 & 0xFF}, + {0xa9cf & 0xFF, 0xa9cf & 0xFF}, + {0xa9d0 & 0xFF, 0xa9d9 & 0xFF}, + {0xaa00 & 0xFF, 0xaa28 & 0xFF}, + {0xaa29 & 0xFF, 0xaa36 & 0xFF}, + {0xaa40 & 0xFF, 0xaa42 & 0xFF}, + {0xaa43 & 0xFF, 0xaa43 & 0xFF}, + {0xaa44 & 0xFF, 0xaa4b & 0xFF}, + {0xaa4c & 0xFF, 0xaa4d & 0xFF}, + {0xaa50 & 0xFF, 0xaa59 & 0xFF}, + {0xaa7b & 0xFF, 0xaa7b & 0xFF}, + {0xaab0 & 0xFF, 0xaab0 & 0xFF}, + {0xaab2 & 0xFF, 0xaab4 & 0xFF}, + {0xaab7 & 0xFF, 0xaab8 & 0xFF}, + {0xaabe & 0xFF, 0xaabf & 0xFF}, + {0xaac1 & 0xFF, 0xaac1 & 0xFF}, + {0xab01 & 0xFF, 0xab06 & 0xFF}, + {0xab09 & 0xFF, 0xab0e & 0xFF}, + {0xab11 & 0xFF, 0xab16 & 0xFF}, + {0xab20 & 0xFF, 0xab26 & 0xFF}, + {0xab28 & 0xFF, 0xab2e & 0xFF}, + {0xabc0 & 0xFF, 0xabe2 & 0xFF}, + {0xabe3 & 0xFF, 0xabea & 0xFF}, + {0xabec & 0xFF, 0xabed & 0xFF}, + {0xabf0 & 0xFF, 0xabf9 & 0xFF}, + {0xac00 & 0xFF, 0xacff & 0xFF}, + {0xad00 & 0xFF, 0xadff & 0xFF}, + {0xae00 & 0xFF, 0xaeff & 0xFF}, + {0xaf00 & 0xFF, 0xafff & 0xFF}, + {0xb000 & 0xFF, 0xb0ff & 0xFF}, + {0xb100 & 0xFF, 0xb1ff & 0xFF}, + {0xb200 & 0xFF, 0xb2ff & 0xFF}, + {0xb300 & 0xFF, 0xb3ff & 0xFF}, + {0xb400 & 0xFF, 0xb4ff & 0xFF}, + {0xb500 & 0xFF, 0xb5ff & 0xFF}, + {0xb600 & 0xFF, 0xb6ff & 0xFF}, + {0xb700 & 0xFF, 0xb7ff & 0xFF}, + {0xb800 & 0xFF, 0xb8ff & 0xFF}, + {0xb900 & 0xFF, 0xb9ff & 0xFF}, + {0xba00 & 0xFF, 0xbaff & 0xFF}, + {0xbb00 & 0xFF, 0xbbff & 0xFF}, + {0xbc00 & 0xFF, 0xbcff & 0xFF}, + {0xbd00 & 0xFF, 0xbdff & 0xFF}, + {0xbe00 & 0xFF, 0xbeff & 0xFF}, + {0xbf00 & 0xFF, 0xbfff & 0xFF}, + {0xc000 & 0xFF, 0xc0ff & 0xFF}, + {0xc100 & 0xFF, 0xc1ff & 0xFF}, + {0xc200 & 0xFF, 0xc2ff & 0xFF}, + {0xc300 & 0xFF, 0xc3ff & 0xFF}, + {0xc400 & 0xFF, 0xc4ff & 0xFF}, + {0xc500 & 0xFF, 0xc5ff & 0xFF}, + {0xc600 & 0xFF, 0xc6ff & 0xFF}, + {0xc700 & 0xFF, 0xc7ff & 0xFF}, + {0xc800 & 0xFF, 0xc8ff & 0xFF}, + {0xc900 & 0xFF, 0xc9ff & 0xFF}, + {0xca00 & 0xFF, 0xcaff & 0xFF}, + {0xcb00 & 0xFF, 0xcbff & 0xFF}, + {0xcc00 & 0xFF, 0xccff & 0xFF}, + {0xcd00 & 0xFF, 0xcdff & 0xFF}, + {0xce00 & 0xFF, 0xceff & 0xFF}, + {0xcf00 & 0xFF, 0xcfff & 0xFF}, + {0xd000 & 0xFF, 0xd0ff & 0xFF}, + {0xd100 & 0xFF, 0xd1ff & 0xFF}, + {0xd200 & 0xFF, 0xd2ff & 0xFF}, + {0xd300 & 0xFF, 0xd3ff & 0xFF}, + {0xd400 & 0xFF, 0xd4ff & 0xFF}, + {0xd500 & 0xFF, 0xd5ff & 0xFF}, + {0xd600 & 0xFF, 0xd6ff & 0xFF}, + {0xd700 & 0xFF, 0xd7a3 & 0xFF}, + {0xd7b0 & 0xFF, 0xd7c6 & 0xFF}, + {0xd7cb & 0xFF, 0xd7fb & 0xFF}, + {0xfb00 & 0xFF, 0xfb06 & 0xFF}, + {0xfb13 & 0xFF, 0xfb17 & 0xFF}, + {0xfb1d & 0xFF, 0xfb1d & 0xFF}, + {0xfb1e & 0xFF, 0xfb1e & 0xFF}, + {0xfb1f & 0xFF, 0xfb28 & 0xFF}, + {0xfb2a & 0xFF, 0xfb36 & 0xFF}, + {0xfb38 & 0xFF, 0xfb3c & 0xFF}, + {0xfb3e & 0xFF, 0xfb3e & 0xFF}, + {0xfb40 & 0xFF, 0xfb41 & 0xFF}, + {0xfb43 & 0xFF, 0xfb44 & 0xFF}, + {0xfb46 & 0xFF, 0xfbb1 & 0xFF}, + {0xfbd3 & 0xFF, 0xfbff & 0xFF}, + {0xfc00 & 0xFF, 0xfcff & 0xFF}, + {0xfd00 & 0xFF, 0xfd3d & 0xFF}, + {0xfd50 & 0xFF, 0xfd8f & 0xFF}, + {0xfd92 & 0xFF, 0xfdc7 & 0xFF}, + {0xfdf0 & 0xFF, 0xfdfb & 0xFF}, + {0xfe00 & 0xFF, 0xfe0f & 0xFF}, + {0xfe10 & 0xFF, 0xfe10 & 0xFF}, + {0xfe13 & 0xFF, 0xfe13 & 0xFF}, + {0xfe14 & 0xFF, 0xfe14 & 0xFF}, + {0xfe20 & 0xFF, 0xfe26 & 0xFF}, + {0xfe33 & 0xFF, 0xfe34 & 0xFF}, + {0xfe4d & 0xFF, 0xfe4f & 0xFF}, + {0xfe50 & 0xFF, 0xfe50 & 0xFF}, + {0xfe52 & 0xFF, 0xfe52 & 0xFF}, + {0xfe54 & 0xFF, 0xfe54 & 0xFF}, + {0xfe55 & 0xFF, 0xfe55 & 0xFF}, + {0xfe70 & 0xFF, 0xfe74 & 0xFF}, + {0xfe76 & 0xFF, 0xfefc & 0xFF}, + {0xfeff & 0xFF, 0xfeff & 0xFF}, + {0xff07 & 0xFF, 0xff07 & 0xFF}, + {0xff0c & 0xFF, 0xff0c & 0xFF}, + {0xff0e & 0xFF, 0xff0e & 0xFF}, + {0xff1a & 0xFF, 0xff1a & 0xFF}, + {0xff1b & 0xFF, 0xff1b & 0xFF}, + {0xff21 & 0xFF, 0xff3a & 0xFF}, + {0xff3f & 0xFF, 0xff3f & 0xFF}, + {0xff41 & 0xFF, 0xff5a & 0xFF}, + {0xff66 & 0xFF, 0xff9d & 0xFF}, + {0xff9e & 0xFF, 0xff9f & 0xFF}, + {0xffa0 & 0xFF, 0xffbe & 0xFF}, + {0xffc2 & 0xFF, 0xffc7 & 0xFF}, + {0xffca & 0xFF, 0xffcf & 0xFF}, + {0xffd2 & 0xFF, 0xffd7 & 0xFF}, + {0xffda & 0xFF, 0xffdc & 0xFF}, + {0xfff9 & 0xFF, 0xfffb & 0xFF}, + {0x10000 & 0xFF, 0x1000b & 0xFF}, + {0x1000d & 0xFF, 0x10026 & 0xFF}, + {0x10028 & 0xFF, 0x1003a & 0xFF}, + {0x1003c & 0xFF, 0x1003d & 0xFF}, + {0x1003f & 0xFF, 0x1004d & 0xFF}, + {0x10050 & 0xFF, 0x1005d & 0xFF}, + {0x10080 & 0xFF, 0x100fa & 0xFF}, + {0x10140 & 0xFF, 0x10174 & 0xFF}, + {0x101fd & 0xFF, 0x101fd & 0xFF}, + {0x10280 & 0xFF, 0x1029c & 0xFF}, + {0x102a0 & 0xFF, 0x102d0 & 0xFF}, + {0x10300 & 0xFF, 0x1031e & 0xFF}, + {0x10330 & 0xFF, 0x1034a & 0xFF}, + {0x10380 & 0xFF, 0x1039d & 0xFF}, + {0x103a0 & 0xFF, 0x103c3 & 0xFF}, + {0x103c8 & 0xFF, 0x103cf & 0xFF}, + {0x103d1 & 0xFF, 0x103d5 & 0xFF}, + {0x10400 & 0xFF, 0x1049d & 0xFF}, + {0x104a0 & 0xFF, 0x104a9 & 0xFF}, + {0x10800 & 0xFF, 0x10805 & 0xFF}, + {0x10808 & 0xFF, 0x10808 & 0xFF}, + {0x1080a & 0xFF, 0x10835 & 0xFF}, + {0x10837 & 0xFF, 0x10838 & 0xFF}, + {0x1083c & 0xFF, 0x1083c & 0xFF}, + {0x1083f & 0xFF, 0x10855 & 0xFF}, + {0x10900 & 0xFF, 0x10915 & 0xFF}, + {0x10920 & 0xFF, 0x10939 & 0xFF}, + {0x10a00 & 0xFF, 0x10a00 & 0xFF}, + {0x10a01 & 0xFF, 0x10a03 & 0xFF}, + {0x10a05 & 0xFF, 0x10a06 & 0xFF}, + {0x10a0c & 0xFF, 0x10a0f & 0xFF}, + {0x10a10 & 0xFF, 0x10a13 & 0xFF}, + {0x10a15 & 0xFF, 0x10a17 & 0xFF}, + {0x10a19 & 0xFF, 0x10a33 & 0xFF}, + {0x10a38 & 0xFF, 0x10a3a & 0xFF}, + {0x10a3f & 0xFF, 0x10a3f & 0xFF}, + {0x10a60 & 0xFF, 0x10a7c & 0xFF}, + {0x10b00 & 0xFF, 0x10b35 & 0xFF}, + {0x10b40 & 0xFF, 0x10b55 & 0xFF}, + {0x10b60 & 0xFF, 0x10b72 & 0xFF}, + {0x10c00 & 0xFF, 0x10c48 & 0xFF}, + {0x11000 & 0xFF, 0x11002 & 0xFF}, + {0x11003 & 0xFF, 0x11037 & 0xFF}, + {0x11038 & 0xFF, 0x11046 & 0xFF}, + {0x11066 & 0xFF, 0x1106f & 0xFF}, + {0x11080 & 0xFF, 0x11082 & 0xFF}, + {0x11083 & 0xFF, 0x110af & 0xFF}, + {0x110b0 & 0xFF, 0x110ba & 0xFF}, + {0x110bd & 0xFF, 0x110bd & 0xFF}, + {0x12000 & 0xFF, 0x120ff & 0xFF}, + {0x12100 & 0xFF, 0x121ff & 0xFF}, + {0x12200 & 0xFF, 0x122ff & 0xFF}, + {0x12300 & 0xFF, 0x1236e & 0xFF}, + {0x12400 & 0xFF, 0x12462 & 0xFF}, + {0x13000 & 0xFF, 0x130ff & 0xFF}, + {0x13100 & 0xFF, 0x131ff & 0xFF}, + {0x13200 & 0xFF, 0x132ff & 0xFF}, + {0x13300 & 0xFF, 0x133ff & 0xFF}, + {0x13400 & 0xFF, 0x1342e & 0xFF}, + {0x16800 & 0xFF, 0x168ff & 0xFF}, + {0x16900 & 0xFF, 0x169ff & 0xFF}, + {0x16a00 & 0xFF, 0x16a38 & 0xFF}, + {0x1b000 & 0xFF, 0x1b000 & 0xFF}, + {0x1d165 & 0xFF, 0x1d169 & 0xFF}, + {0x1d16d & 0xFF, 0x1d172 & 0xFF}, + {0x1d173 & 0xFF, 0x1d17a & 0xFF}, + {0x1d17b & 0xFF, 0x1d182 & 0xFF}, + {0x1d185 & 0xFF, 0x1d18b & 0xFF}, + {0x1d1aa & 0xFF, 0x1d1ad & 0xFF}, + {0x1d242 & 0xFF, 0x1d244 & 0xFF}, + {0x1d400 & 0xFF, 0x1d454 & 0xFF}, + {0x1d456 & 0xFF, 0x1d49c & 0xFF}, + {0x1d49e & 0xFF, 0x1d49f & 0xFF}, + {0x1d4a2 & 0xFF, 0x1d4a2 & 0xFF}, + {0x1d4a5 & 0xFF, 0x1d4a6 & 0xFF}, + {0x1d4a9 & 0xFF, 0x1d4ac & 0xFF}, + {0x1d4ae & 0xFF, 0x1d4b9 & 0xFF}, + {0x1d4bb & 0xFF, 0x1d4bb & 0xFF}, + {0x1d4bd & 0xFF, 0x1d4c3 & 0xFF}, + {0x1d4c5 & 0xFF, 0x1d4ff & 0xFF}, + {0x1d500 & 0xFF, 0x1d505 & 0xFF}, + {0x1d507 & 0xFF, 0x1d50a & 0xFF}, + {0x1d50d & 0xFF, 0x1d514 & 0xFF}, + {0x1d516 & 0xFF, 0x1d51c & 0xFF}, + {0x1d51e & 0xFF, 0x1d539 & 0xFF}, + {0x1d53b & 0xFF, 0x1d53e & 0xFF}, + {0x1d540 & 0xFF, 0x1d544 & 0xFF}, + {0x1d546 & 0xFF, 0x1d546 & 0xFF}, + {0x1d54a & 0xFF, 0x1d550 & 0xFF}, + {0x1d552 & 0xFF, 0x1d5ff & 0xFF}, + {0x1d600 & 0xFF, 0x1d6a5 & 0xFF}, + {0x1d6a8 & 0xFF, 0x1d6c0 & 0xFF}, + {0x1d6c2 & 0xFF, 0x1d6da & 0xFF}, + {0x1d6dc & 0xFF, 0x1d6fa & 0xFF}, + {0x1d6fc & 0xFF, 0x1d6ff & 0xFF}, + {0x1d700 & 0xFF, 0x1d714 & 0xFF}, + {0x1d716 & 0xFF, 0x1d734 & 0xFF}, + {0x1d736 & 0xFF, 0x1d74e & 0xFF}, + {0x1d750 & 0xFF, 0x1d76e & 0xFF}, + {0x1d770 & 0xFF, 0x1d788 & 0xFF}, + {0x1d78a & 0xFF, 0x1d7a8 & 0xFF}, + {0x1d7aa & 0xFF, 0x1d7c2 & 0xFF}, + {0x1d7c4 & 0xFF, 0x1d7cb & 0xFF}, + {0x1d7ce & 0xFF, 0x1d7ff & 0xFF}, + {0xe0001 & 0xFF, 0xe0001 & 0xFF}, + {0xe0020 & 0xFF, 0xe007f & 0xFF}, + {0xe0100 & 0xFF, 0xe01ef & 0xFF}}; + +static const uint8_t unicode_classtab[]={ + UNICODE_WB_LF, + UNICODE_WB_Newline, + UNICODE_WB_CR, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidNum, + UNICODE_WB_MidNumLet, + UNICODE_WB_Numeric, + UNICODE_WB_MidLetter, + UNICODE_WB_MidNum, + UNICODE_WB_ALetter, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_ALetter, + UNICODE_WB_Newline, + UNICODE_WB_ALetter, + UNICODE_WB_Format, + UNICODE_WB_ALetter, + UNICODE_WB_MidLetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_MidNum, + UNICODE_WB_ALetter, + UNICODE_WB_MidLetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_MidNum, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_MidLetter, + UNICODE_WB_Format, + UNICODE_WB_MidNum, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Numeric, + UNICODE_WB_MidNum, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Format, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Format, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_MidNum, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Format, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Format, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidLetter, + UNICODE_WB_Newline, + UNICODE_WB_Format, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_MidNum, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_Format, + UNICODE_WB_Format, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Katakana, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Katakana, + UNICODE_WB_Katakana, + UNICODE_WB_Katakana, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Katakana, + UNICODE_WB_Katakana, + UNICODE_WB_Katakana, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_MidNum, + UNICODE_WB_MidLetter, + UNICODE_WB_MidNum, + UNICODE_WB_Extend, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_MidNum, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidNum, + UNICODE_WB_MidLetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Format, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidNum, + UNICODE_WB_MidNumLet, + UNICODE_WB_MidLetter, + UNICODE_WB_MidNum, + UNICODE_WB_ALetter, + UNICODE_WB_ExtendNumLet, + UNICODE_WB_ALetter, + UNICODE_WB_Katakana, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Format, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Numeric, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_Extend, + UNICODE_WB_Format, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Katakana, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Format, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_Extend, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_ALetter, + UNICODE_WB_Numeric, + UNICODE_WB_Format, + UNICODE_WB_Format, + UNICODE_WB_Extend}; + +static const size_t unicode_indextab[]={ + 0, + 21, + 22, + 27, + 39, + 42, + 55, + 77, + 91, + 101, + 132, + 167, + 202, + 234, + 259, + 268, + 283, + 297, + 298, + 312, + 318, + 319, + 320, + 325, + 339, + 346, + 353, + 360, + 373, + 385, + 388, + 389, + 408, + 424, + 438, + 438, + 438, + 439, + 439, + 439, + 439, + 439, + 439, + 439, + 439, + 444, + 458, + 459, + 459, + 467, + 471, + 472, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 473, + 474, + 475, + 476, + 477, + 479, + 480, + 490, + 496, + 512, + 523, + 536, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 591, + 603, + 604, + 608, + 622, + 638, + 645, + 647, + 649, + 655, + 657, + 657, + 657, + 657, + 663, + 665, + 675, + 678, + 679, + 679, + 679, + 679, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 687, + 688, + 689, + 690, + 691, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 692, + 693, + 694, + 695, + 696, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 697, + 698, + 699, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 700, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 701, + 707, + 708, + 708, + 718, + 728, + 733, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 742, + 744, + 745}; + diff --git a/unicode/wordbreaktab_internal.h b/unicode/wordbreaktab_internal.h new file mode 100644 index 0000000..58d4d20 --- /dev/null +++ b/unicode/wordbreaktab_internal.h @@ -0,0 +1,25 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#ifndef wordbreaktab_internal_h +#define wordbreaktab_internal_h + +#define UNICODE_WB_ALetter 0x00 +#define UNICODE_WB_Numeric 0x01 +#define UNICODE_WB_MidLetter 0x02 +#define UNICODE_WB_MidNum 0x03 +#define UNICODE_WB_MidNumLet 0x04 +#define UNICODE_WB_ExtendNumLet 0x05 + +#define UNICODE_WB_CR 0x06 +#define UNICODE_WB_LF 0x07 +#define UNICODE_WB_Newline 0x08 +#define UNICODE_WB_Extend 0x09 +#define UNICODE_WB_Format 0x0A +#define UNICODE_WB_Katakana 0x0B + +#define UNICODE_WB_OTHER 0xFF +#endif diff --git a/unicode/wordbreaktest.C b/unicode/wordbreaktest.C new file mode 100644 index 0000000..35a1d27 --- /dev/null +++ b/unicode/wordbreaktest.C @@ -0,0 +1,145 @@ +#include "unicode_config.h" +#include "unicode.h" + +#include <iostream> +#include <fstream> +#include <sstream> +#include <iomanip> +#include <algorithm> +#include <functional> +#include <cstdlib> +#include <list> +#include <vector> + +class collect_wordbreakflags : public mail::wordbreak_callback_base { + +public: + + std::vector<bool> flags; + + template<typename iter_type> void operator()(iter_type b, iter_type e) + { + mail::wordbreak_callback_base::operator()(b, e); + } + + using mail::wordbreak_callback_base::operator<<; + +private: + int operator()(bool flag) + { + flags.push_back(flag); + return 0; + } +}; + +static void testsuite() +{ + std::string buf; + int linenum=0; + + std::ifstream fp("WordBreakTest.txt"); + + if (!fp.is_open()) + exit(1); + + while (1) + { + buf.clear(); + + if (std::getline(fp, buf).eof() && buf.empty()) + break; + + ++linenum; + + buf.erase(std::find(buf.begin(), buf.end(), '#'), buf.end()); + + if (buf.empty()) + continue; + + std::list<std::string> words; + + for (std::string::iterator b=buf.begin(), e=buf.end(); b != e;) + { + if (isspace(*b)) + { + ++b; + continue; + } + + std::string::iterator p=b; + + while (b != e) + { + if (isspace(*b)) + break; + ++b; + } + + words.push_back(std::string(p, b)); + } + + std::vector<unicode_char> ubuf; + std::vector<bool> status; + + while (1) + { + if (!words.empty() && words.front().size() > 1) + { + bool flag=false; + std::string s=words.front(); + + words.pop_front(); + + if ((unsigned char)s[0] == + (unsigned char)0xc3 && + (unsigned char)s[1] == (unsigned char)0xb7) + flag=true; + + if (words.empty()) + break; + + status.push_back(flag); + + std::istringstream i(words.front()); + + unicode_char uc; + + i >> std::hex >> uc; + + words.pop_front(); + + if (!i.fail()) + { + ubuf.push_back(uc); + continue; + } + } + + std::cerr << "Parse error, line " << linenum + << ": " << buf << std::endl; + exit(1); + } + + if (linenum == 24) + { + linenum=24; + } + collect_wordbreakflags flags; + + flags(ubuf.begin(), ubuf.end()); + flags.finish(); + + if (status != flags.flags) + { + std::cerr << "Regression, line " << linenum + << ": " << buf << std::endl; + exit(1); + } + } +} + +int main(int argc, char **argv) +{ + testsuite(); + return 0; +} |
